1# Copyright 2016 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 5 6# Recipe module for Skia Swarming test. 7 8 9DEPS = [ 10 'core', 11 'env', 12 'flavor', 13 'recipe_engine/context', 14 'recipe_engine/file', 15 'recipe_engine/json', 16 'recipe_engine/path', 17 'recipe_engine/platform', 18 'recipe_engine/properties', 19 'recipe_engine/python', 20 'recipe_engine/raw_io', 21 'recipe_engine/step', 22 'run', 23 'vars', 24] 25 26 27def dm_flags(api, bot): 28 args = [] 29 30 # This enables non-deterministic random seeding of the GPU FP optimization 31 # test. 32 args.append('--randomProcessorTest') 33 34 # 32-bit desktop bots tend to run out of memory, because they have relatively 35 # far more cores than RAM (e.g. 32 cores, 3G RAM). Hold them back a bit. 36 if '-x86-' in bot and not 'NexusPlayer' in bot: 37 args.extend(['--threads', '4']) 38 39 # Avoid issues with dynamically exceeding resource cache limits. 40 if 'Test' in bot and 'DISCARDABLE' in bot: 41 args.extend(['--threads', '0']) 42 43 # See if staying on the main thread helps skia:6748. 44 if 'Test-iOS' in bot: 45 args.extend(['--threads', '0']) 46 47 # These are the canonical configs that we would ideally run on all bots. We 48 # may opt out or substitute some below for specific bots 49 configs = ['8888', 'srgb', 'pdf'] 50 # Add in either gles or gl configs to the canonical set based on OS 51 sample_count = '8' 52 gl_prefix = 'gl' 53 if 'Android' in bot or 'iOS' in bot: 54 sample_count = '4' 55 # We want to test the OpenGL config not the GLES config on the Shield 56 if 'NVIDIA_Shield' not in bot: 57 gl_prefix = 'gles' 58 elif 'Intel' in bot: 59 sample_count = '' 60 elif 'ChromeOS' in bot: 61 gl_prefix = 'gles' 62 63 configs.extend([gl_prefix, gl_prefix + 'dft', gl_prefix + 'srgb']) 64 if sample_count is not '': 65 configs.append(gl_prefix + 'msaa' + sample_count) 66 67 # The NP produces a long error stream when we run with MSAA. The Tegra3 just 68 # doesn't support it. 69 if ('NexusPlayer' in bot or 70 'Tegra3' in bot or 71 # We aren't interested in fixing msaa bugs on current iOS devices. 72 'iPad4' in bot or 73 'iPadPro' in bot or 74 'iPhone6' in bot or 75 'iPhone7' in bot or 76 # skia:5792 77 'IntelHD530' in bot or 78 'IntelIris540' in bot): 79 configs = [x for x in configs if 'msaa' not in x] 80 81 # The NP produces different images for dft on every run. 82 if 'NexusPlayer' in bot: 83 configs = [x for x in configs if 'dft' not in x] 84 85 # Runs out of memory on Android bots. Everyone else seems fine. 86 if 'Android' in bot: 87 configs.remove('pdf') 88 89 if '-GCE-' in bot: 90 configs.extend(['565']) 91 configs.extend(['f16']) 92 configs.extend(['sp-8888', '2ndpic-8888']) # Test niche uses of SkPicture. 93 configs.extend(['lite-8888']) # Experimental display list. 94 configs.extend(['gbr-8888']) 95 96 if '-TSAN' not in bot and sample_count is not '': 97 if ('TegraK1' in bot or 98 'TegraX1' in bot or 99 'GTX550Ti' in bot or 100 'GTX660' in bot or 101 'GT610' in bot): 102 configs.append(gl_prefix + 'nvprdit' + sample_count) 103 104 # We want to test both the OpenGL config and the GLES config on Linux Intel: 105 # GL is used by Chrome, GLES is used by ChromeOS. 106 if 'Intel' in bot and api.vars.is_linux: 107 configs.extend(['gles', 'glesdft', 'glessrgb']) 108 109 # NP is running out of RAM when we run all these modes. skia:3255 110 if 'NexusPlayer' not in bot: 111 configs.extend(mode + '-8888' for mode in 112 ['serialize', 'tiles_rt', 'pic']) 113 114 # Test instanced rendering on a limited number of platforms 115 if 'Nexus6' in bot: 116 configs.append(gl_prefix + 'inst') # inst msaa isn't working yet on Adreno. 117 elif 'NVIDIA_Shield' in bot or 'PixelC' in bot: 118 # Multisampled instanced configs use nvpr so we substitute inst msaa 119 # configs for nvpr msaa configs. 120 old = gl_prefix + 'nvpr' 121 new = gl_prefix + 'inst' 122 configs = [x.replace(old, new) for x in configs] 123 # We also test non-msaa instanced. 124 configs.append(new) 125 elif 'MacMini6.2' in bot and sample_count is not '': 126 configs.extend([gl_prefix + 'inst', gl_prefix + 'inst' + sample_count]) 127 128 # CommandBuffer bot *only* runs the command_buffer config. 129 if 'CommandBuffer' in bot: 130 configs = ['commandbuffer'] 131 132 # ANGLE bot *only* runs the angle configs 133 if 'ANGLE' in bot: 134 configs = ['angle_d3d11_es2', 135 'angle_d3d9_es2', 136 'angle_gl_es2', 137 'angle_d3d11_es3'] 138 if sample_count is not '': 139 configs.append('angle_d3d11_es2_msaa' + sample_count) 140 configs.append('angle_d3d11_es3_msaa' + sample_count) 141 142 # Vulkan bot *only* runs the vk config. 143 if 'Vulkan' in bot: 144 configs = ['vk'] 145 146 if 'ChromeOS' in bot: 147 # Just run GLES for now - maybe add gles_msaa4 in the future 148 configs = ['gles'] 149 150 if 'Ci20' in bot: 151 # This bot is really slow, cut it down to just 8888. 152 configs = ['8888'] 153 154 # This bot only differs from vanilla CPU bots in 8888 config. 155 if 'SK_FORCE_RASTER_PIPELINE_BLITTER' in bot: 156 configs = ['8888', 'srgb'] 157 158 args.append('--config') 159 args.extend(configs) 160 161 # Test coverage counting path renderer. 162 if 'CCPR' in bot: 163 args.extend(['--pr', 'ccpr']) 164 165 # Run tests, gms, and image decoding tests everywhere. 166 args.extend('--src tests gm image colorImage svg'.split(' ')) 167 if 'Vulkan' in bot and 'NexusPlayer' in bot: 168 args.remove('svg') 169 args.remove('image') 170 171 # Eventually I'd like these to pass, but for now just skip 'em. 172 if 'SK_FORCE_RASTER_PIPELINE_BLITTER' in bot: 173 args.remove('tests') 174 175 # Some people don't like verbose output. 176 verbose = False 177 178 blacklisted = [] 179 def blacklist(quad): 180 config, src, options, name = quad.split(' ') if type(quad) is str else quad 181 if config == '_' or config in configs: 182 blacklisted.extend([config, src, options, name]) 183 184 # TODO: ??? 185 blacklist('f16 _ _ dstreadshuffle') 186 blacklist('glsrgb image _ _') 187 blacklist('glessrgb image _ _') 188 189 # Not any point to running these. 190 blacklist('gbr-8888 image _ _') 191 blacklist('gbr-8888 colorImage _ _') 192 193 if 'Valgrind' in bot: 194 # These take 18+ hours to run. 195 blacklist('pdf gm _ fontmgr_iter') 196 blacklist('pdf _ _ PANO_20121023_214540.jpg') 197 blacklist('pdf skp _ worldjournal') 198 blacklist('pdf skp _ desk_baidu.skp') 199 blacklist('pdf skp _ desk_wikipedia.skp') 200 blacklist('_ svg _ _') 201 202 if 'iOS' in bot: 203 blacklist(gl_prefix + ' skp _ _') 204 205 if 'Mac' in bot or 'iOS' in bot: 206 # CG fails on questionable bmps 207 blacklist('_ image gen_platf rgba32abf.bmp') 208 blacklist('_ image gen_platf rgb24prof.bmp') 209 blacklist('_ image gen_platf rgb24lprof.bmp') 210 blacklist('_ image gen_platf 8bpp-pixeldata-cropped.bmp') 211 blacklist('_ image gen_platf 4bpp-pixeldata-cropped.bmp') 212 blacklist('_ image gen_platf 32bpp-pixeldata-cropped.bmp') 213 blacklist('_ image gen_platf 24bpp-pixeldata-cropped.bmp') 214 215 # CG has unpredictable behavior on this questionable gif 216 # It's probably using uninitialized memory 217 blacklist('_ image gen_platf frame_larger_than_image.gif') 218 219 # CG has unpredictable behavior on incomplete pngs 220 # skbug.com/5774 221 blacklist('_ image gen_platf inc0.png') 222 blacklist('_ image gen_platf inc1.png') 223 blacklist('_ image gen_platf inc2.png') 224 blacklist('_ image gen_platf inc3.png') 225 blacklist('_ image gen_platf inc4.png') 226 blacklist('_ image gen_platf inc5.png') 227 blacklist('_ image gen_platf inc6.png') 228 blacklist('_ image gen_platf inc7.png') 229 blacklist('_ image gen_platf inc8.png') 230 blacklist('_ image gen_platf inc9.png') 231 blacklist('_ image gen_platf inc10.png') 232 blacklist('_ image gen_platf inc11.png') 233 blacklist('_ image gen_platf inc12.png') 234 blacklist('_ image gen_platf inc13.png') 235 blacklist('_ image gen_platf inc14.png') 236 237 # WIC fails on questionable bmps 238 if 'Win' in bot: 239 blacklist('_ image gen_platf rle8-height-negative.bmp') 240 blacklist('_ image gen_platf rle4-height-negative.bmp') 241 blacklist('_ image gen_platf pal8os2v2.bmp') 242 blacklist('_ image gen_platf pal8os2v2-16.bmp') 243 blacklist('_ image gen_platf rgba32abf.bmp') 244 blacklist('_ image gen_platf rgb24prof.bmp') 245 blacklist('_ image gen_platf rgb24lprof.bmp') 246 blacklist('_ image gen_platf 8bpp-pixeldata-cropped.bmp') 247 blacklist('_ image gen_platf 4bpp-pixeldata-cropped.bmp') 248 blacklist('_ image gen_platf 32bpp-pixeldata-cropped.bmp') 249 blacklist('_ image gen_platf 24bpp-pixeldata-cropped.bmp') 250 if 'x86_64' in bot and 'CPU' in bot: 251 # This GM triggers a SkSmallAllocator assert. 252 blacklist('_ gm _ composeshader_bitmap') 253 254 # WIC and CG fail on arithmetic jpegs 255 if 'Win' in bot or 'Mac' in bot: 256 blacklist('_ image gen_platf testimgari.jpg') 257 258 if 'Android' in bot or 'iOS' in bot: 259 # This test crashes the N9 (perhaps because of large malloc/frees). It also 260 # is fairly slow and not platform-specific. So we just disable it on all of 261 # Android and iOS. skia:5438 262 blacklist('_ test _ GrShape') 263 264 # skia:4095 265 bad_serialize_gms = ['bleed_image', 266 'c_gms', 267 'colortype', 268 'colortype_xfermodes', 269 'drawfilter', 270 'fontmgr_bounds_0.75_0', 271 'fontmgr_bounds_1_-0.25', 272 'fontmgr_bounds', 273 'fontmgr_match', 274 'fontmgr_iter', 275 'imagemasksubset'] 276 277 # skia:5589 278 bad_serialize_gms.extend(['bitmapfilters', 279 'bitmapshaders', 280 'bleed', 281 'bleed_alpha_bmp', 282 'bleed_alpha_bmp_shader', 283 'convex_poly_clip', 284 'extractalpha', 285 'filterbitmap_checkerboard_32_32_g8', 286 'filterbitmap_image_mandrill_64', 287 'shadows', 288 'simpleaaclip_aaclip']) 289 # skia:5595 290 bad_serialize_gms.extend(['composeshader_bitmap', 291 'scaled_tilemodes_npot', 292 'scaled_tilemodes']) 293 294 # skia:5778 295 bad_serialize_gms.append('typefacerendering_pfaMac') 296 # skia:5942 297 bad_serialize_gms.append('parsedpaths') 298 299 # these use a custom image generator which doesn't serialize 300 bad_serialize_gms.append('ImageGeneratorExternal_rect') 301 bad_serialize_gms.append('ImageGeneratorExternal_shader') 302 303 # skia:6189 304 bad_serialize_gms.append('shadow_utils') 305 306 # Not expected to round trip encoding/decoding. 307 bad_serialize_gms.append('makecolorspace') 308 309 for test in bad_serialize_gms: 310 blacklist(['serialize-8888', 'gm', '_', test]) 311 312 if 'Mac' not in bot: 313 for test in ['bleed_alpha_image', 'bleed_alpha_image_shader']: 314 blacklist(['serialize-8888', 'gm', '_', test]) 315 # It looks like we skip these only for out-of-memory concerns. 316 if 'Win' in bot or 'Android' in bot: 317 for test in ['verylargebitmap', 'verylarge_picture_image']: 318 blacklist(['serialize-8888', 'gm', '_', test]) 319 320 # skia:4769 321 for test in ['drawfilter']: 322 blacklist([ 'sp-8888', 'gm', '_', test]) 323 blacklist([ 'pic-8888', 'gm', '_', test]) 324 blacklist(['2ndpic-8888', 'gm', '_', test]) 325 blacklist([ 'lite-8888', 'gm', '_', test]) 326 # skia:4703 327 for test in ['image-cacherator-from-picture', 328 'image-cacherator-from-raster', 329 'image-cacherator-from-ctable']: 330 blacklist([ 'sp-8888', 'gm', '_', test]) 331 blacklist([ 'pic-8888', 'gm', '_', test]) 332 blacklist([ '2ndpic-8888', 'gm', '_', test]) 333 blacklist(['serialize-8888', 'gm', '_', test]) 334 335 # GM that requires raster-backed canvas 336 for test in ['gamut', 'complexclip4_bw', 'complexclip4_aa']: 337 blacklist([ 'sp-8888', 'gm', '_', test]) 338 blacklist([ 'pic-8888', 'gm', '_', test]) 339 blacklist([ 'lite-8888', 'gm', '_', test]) 340 blacklist([ '2ndpic-8888', 'gm', '_', test]) 341 blacklist(['serialize-8888', 'gm', '_', test]) 342 343 # GM that not support tiles_rt 344 for test in ['complexclip4_bw', 'complexclip4_aa']: 345 blacklist([ 'tiles_rt-8888', 'gm', '_', test]) 346 347 # Extensions for RAW images 348 r = ["arw", "cr2", "dng", "nef", "nrw", "orf", "raf", "rw2", "pef", "srw", 349 "ARW", "CR2", "DNG", "NEF", "NRW", "ORF", "RAF", "RW2", "PEF", "SRW"] 350 351 # skbug.com/4888 352 # Blacklist RAW images (and a few large PNGs) on GPU bots 353 # until we can resolve failures. 354 if 'GPU' in bot: 355 blacklist('_ image _ interlaced1.png') 356 blacklist('_ image _ interlaced2.png') 357 blacklist('_ image _ interlaced3.png') 358 for raw_ext in r: 359 blacklist('_ image _ .%s' % raw_ext) 360 361 # Blacklist memory intensive tests on 32-bit bots. 362 if ('Win2k8' in bot or 'Win8' in bot) and 'x86-' in bot: 363 blacklist('_ image f16 _') 364 blacklist('_ image _ abnormal.wbmp') 365 blacklist('_ image _ interlaced1.png') 366 blacklist('_ image _ interlaced2.png') 367 blacklist('_ image _ interlaced3.png') 368 for raw_ext in r: 369 blacklist('_ image _ .%s' % raw_ext) 370 371 if 'IntelHD405' in bot and 'Ubuntu16' in bot: 372 # skia:6331 373 blacklist(['glmsaa8', 'image', 'gen_codec_gpu', 'abnormal.wbmp']) 374 blacklist(['glesmsaa4', 'image', 'gen_codec_gpu', 'abnormal.wbmp']) 375 376 if 'Nexus5' in bot: 377 # skia:5876 378 blacklist(['_', 'gm', '_', 'encode-platform']) 379 380 if 'AndroidOne-GPU' in bot: # skia:4697, skia:4704, skia:4694, skia:4705 381 blacklist(['_', 'gm', '_', 'bigblurs']) 382 blacklist(['_', 'gm', '_', 'bleed']) 383 blacklist(['_', 'gm', '_', 'bleed_alpha_bmp']) 384 blacklist(['_', 'gm', '_', 'bleed_alpha_bmp_shader']) 385 blacklist(['_', 'gm', '_', 'bleed_alpha_image']) 386 blacklist(['_', 'gm', '_', 'bleed_alpha_image_shader']) 387 blacklist(['_', 'gm', '_', 'bleed_image']) 388 blacklist(['_', 'gm', '_', 'dropshadowimagefilter']) 389 blacklist(['_', 'gm', '_', 'filterfastbounds']) 390 blacklist([gl_prefix, 'gm', '_', 'imageblurtiled']) 391 blacklist(['_', 'gm', '_', 'imagefiltersclipped']) 392 blacklist(['_', 'gm', '_', 'imagefiltersscaled']) 393 blacklist(['_', 'gm', '_', 'imageresizetiled']) 394 blacklist(['_', 'gm', '_', 'matrixconvolution']) 395 blacklist(['_', 'gm', '_', 'strokedlines']) 396 if sample_count is not '': 397 gl_msaa_config = gl_prefix + 'msaa' + sample_count 398 blacklist([gl_msaa_config, 'gm', '_', 'imageblurtiled']) 399 blacklist([gl_msaa_config, 'gm', '_', 'imagefiltersbase']) 400 401 match = [] 402 if 'Valgrind' in bot: # skia:3021 403 match.append('~Threaded') 404 405 if 'Valgrind' in bot and 'PreAbandonGpuContext' in bot: 406 # skia:6575 407 match.append('~multipicturedraw_') 408 409 if 'CommandBuffer' in bot: 410 # https://crbug.com/697030 411 match.append('~HalfFloatAlphaTextureTest') 412 413 if 'AndroidOne' in bot: # skia:4711 414 match.append('~WritePixels') 415 416 if 'NexusPlayer' in bot: 417 match.append('~ResourceCache') 418 419 if 'Nexus10' in bot: 420 match.append('~CopySurface') # skia:5509 421 match.append('~SRGBReadWritePixels') # skia:6097 422 423 if 'GalaxyS6' in bot: 424 match.append('~SpecialImage') # skia:6338 425 match.append('~skbug6653') # skia:6653 426 427 if 'GalaxyS7_G930A' in bot: 428 match.append('~WritePixels') # skia:6427 429 430 if 'MSAN' in bot: 431 match.extend(['~Once', '~Shared']) # Not sure what's up with these tests. 432 433 if 'TSAN' in bot: 434 match.extend(['~ReadWriteAlpha']) # Flaky on TSAN-covered on nvidia bots. 435 match.extend(['~RGBA4444TextureTest', # Flakier than they are important. 436 '~RGB565TextureTest']) 437 438 if 'Vulkan' in bot and 'Adreno530' in bot: 439 # skia:5777 440 match.extend(['~CopySurface']) 441 442 if 'Vulkan' in bot and 'NexusPlayer' in bot: 443 match.extend(['~gradients_no_texture$', # skia:6132 444 '~tilemodes', # skia:6132 445 '~shadertext$', # skia:6132 446 '~bitmapfilters', # skia:6132 447 '~GrContextFactory_abandon']) #skia:6209 448 449 if 'Vulkan' in bot and 'IntelIris540' in bot and api.vars.is_linux: 450 match.extend(['~VkHeapTests']) # skia:6245 451 452 if 'Intel' in bot and api.vars.is_linux and not 'Vulkan' in bot: 453 # TODO(dogben): Track down what's causing bots to die. 454 verbose = True 455 456 if 'Vulkan' in bot and 'IntelIris540' in bot and 'Win' in bot: 457 # skia:6398 458 blacklist(['vk', 'gm', '_', 'aarectmodes']) 459 blacklist(['vk', 'gm', '_', 'aaxfermodes']) 460 blacklist(['vk', 'gm', '_', 'arithmode']) 461 blacklist(['vk', 'gm', '_', 'composeshader_bitmap']) 462 blacklist(['vk', 'gm', '_', 'composeshader_bitmap2']) 463 blacklist(['vk', 'gm', '_', 'dftextCOLR']) 464 blacklist(['vk', 'gm', '_', 'drawregionmodes']) 465 blacklist(['vk', 'gm', '_', 'filterfastbounds']) 466 blacklist(['vk', 'gm', '_', 'fontcache']) 467 blacklist(['vk', 'gm', '_', 'fontmgr_iterWin10']) 468 blacklist(['vk', 'gm', '_', 'fontmgr_iter_factoryWin10']) 469 blacklist(['vk', 'gm', '_', 'fontmgr_matchWin10']) 470 blacklist(['vk', 'gm', '_', 'fontscalerWin']) 471 blacklist(['vk', 'gm', '_', 'fontscalerdistortable']) 472 blacklist(['vk', 'gm', '_', 'gammagradienttext']) 473 blacklist(['vk', 'gm', '_', 'gammatextWin']) 474 blacklist(['vk', 'gm', '_', 'gradtext']) 475 blacklist(['vk', 'gm', '_', 'hairmodes']) 476 blacklist(['vk', 'gm', '_', 'imagefilters_xfermodes']) 477 blacklist(['vk', 'gm', '_', 'imagefiltersclipped']) 478 blacklist(['vk', 'gm', '_', 'imagefiltersgraph']) 479 blacklist(['vk', 'gm', '_', 'imagefiltersscaled']) 480 blacklist(['vk', 'gm', '_', 'imagefiltersstroked']) 481 blacklist(['vk', 'gm', '_', 'imagefilterstransformed']) 482 blacklist(['vk', 'gm', '_', 'imageresizetiled']) 483 blacklist(['vk', 'gm', '_', 'lcdblendmodes']) 484 blacklist(['vk', 'gm', '_', 'lcdoverlap']) 485 blacklist(['vk', 'gm', '_', 'lcdtextWin']) 486 blacklist(['vk', 'gm', '_', 'lcdtextsize']) 487 blacklist(['vk', 'gm', '_', 'matriximagefilter']) 488 blacklist(['vk', 'gm', '_', 'mixedtextblobsCOLR']) 489 blacklist(['vk', 'gm', '_', 'mixershader']) 490 blacklist(['vk', 'gm', '_', 'pictureimagefilter']) 491 blacklist(['vk', 'gm', '_', 'resizeimagefilter']) 492 blacklist(['vk', 'gm', '_', 'rotate_imagefilter']) 493 blacklist(['vk', 'gm', '_', 'savelayer_lcdtext']) 494 blacklist(['vk', 'gm', '_', 'srcmode']) 495 blacklist(['vk', 'gm', '_', 'surfaceprops']) 496 blacklist(['vk', 'gm', '_', 'textblobgeometrychange']) 497 blacklist(['vk', 'gm', '_', 'textbloblooper']) 498 blacklist(['vk', 'gm', '_', 'textblobmixedsizes']) 499 blacklist(['vk', 'gm', '_', 'textblobmixedsizes_df']) 500 blacklist(['vk', 'gm', '_', 'textblobrandomfont']) 501 blacklist(['vk', 'gm', '_', 'textfilter_color']) 502 blacklist(['vk', 'gm', '_', 'textfilter_image']) 503 blacklist(['vk', 'gm', '_', 'typefacerenderingWin']) 504 blacklist(['vk', 'gm', '_', 'varied_text_clipped_lcd']) 505 blacklist(['vk', 'gm', '_', 'varied_text_ignorable_clip_lcd']) 506 blacklist(['vk', 'gm', '_', 'xfermodeimagefilter']) 507 match.append('~ApplyGamma') 508 match.append('~ComposedImageFilterBounds_Gpu') 509 match.append('~DeferredTextureImage') 510 match.append('~GrMeshTest') 511 match.append('~ImageFilterFailAffectsTransparentBlack_Gpu') 512 match.append('~ImageFilterZeroBlurSigma_Gpu') 513 match.append('~ImageNewShader_GPU') 514 match.append('~NewTextureFromPixmap') 515 match.append('~ReadPixels_Gpu') 516 match.append('~ReadPixels_Texture') 517 match.append('~ReadWriteAlpha') 518 match.append('~skbug6653') 519 match.append('~SRGBReadWritePixels') 520 match.append('~SpecialImage_DeferredGpu') 521 match.append('~SpecialImage_Gpu') 522 match.append('~WritePixels_Gpu') 523 match.append('~WritePixelsNonTexture_Gpu') 524 match.append('~XfermodeImageFilterCroppedInput_Gpu') 525 526 if 'IntelIris540' in bot and 'ANGLE' in bot: 527 for config in ['angle_d3d9_es2', 'angle_d3d11_es2', 'angle_gl_es2']: 528 # skia:6103 529 blacklist([config, 'gm', '_', 'multipicturedraw_invpathclip_simple']) 530 blacklist([config, 'gm', '_', 'multipicturedraw_noclip_simple']) 531 blacklist([config, 'gm', '_', 'multipicturedraw_pathclip_simple']) 532 blacklist([config, 'gm', '_', 'multipicturedraw_rectclip_simple']) 533 blacklist([config, 'gm', '_', 'multipicturedraw_rrectclip_simple']) 534 # skia:6141 535 blacklist([config, 'gm', '_', 'discard']) 536 537 if 'IntelBayTrail' in bot and api.vars.is_linux: 538 match.append('~ImageStorageLoad') # skia:6358 539 540 if 'Ci20' in bot: 541 match.append('~Codec_Dimensions') # skia:6477 542 match.append('~FontMgrAndroidParser') # skia:6478 543 match.append('~PathOpsSimplify') # skia:6479 544 blacklist(['_', 'gm', '_', 'fast_slow_blurimagefilter']) # skia:6480 545 546 if ('Win10' in bot and 'Vulkan' in bot 547 and ('GTX1070' in bot or 'GTX660' in bot)): 548 blacklist('_ test _ SkImage_makeTextureImage') # skia:6554 549 550 if blacklisted: 551 args.append('--blacklist') 552 args.extend(blacklisted) 553 554 if match: 555 args.append('--match') 556 args.extend(match) 557 558 # These bots run out of memory running RAW codec tests. Do not run them in 559 # parallel 560 if ('NexusPlayer' in bot or 'Nexus5' in bot or 'Nexus9' in bot 561 or 'Win8-MSVC-ShuttleB' in bot): 562 args.append('--noRAW_threading') 563 564 if 'Valgrind' in bot and 'PreAbandonGpuContext' in bot: 565 verbose = True 566 567 if 'NexusPlayer' in bot and 'CPU' in bot: 568 # The Nexus Player's image decoding tests are slow enough that swarming 569 # times it out for not printing anything frequently enough. --verbose 570 # makes dm print something every time we start or complete a task. 571 verbose = True 572 573 if verbose: 574 args.append('--verbose') 575 576 return args 577 578 579def key_params(api): 580 """Build a unique key from the builder name (as a list). 581 582 E.g. arch x86 gpu GeForce320M mode MacMini4.1 os Mac10.6 583 """ 584 # Don't bother to include role, which is always Test. 585 # TryBots are uploaded elsewhere so they can use the same key. 586 blacklist = ['role', 'is_trybot'] 587 588 flat = [] 589 for k in sorted(api.vars.builder_cfg.keys()): 590 if k not in blacklist: 591 flat.append(k) 592 flat.append(api.vars.builder_cfg[k]) 593 return flat 594 595 596def test_steps(api): 597 """Run the DM test.""" 598 use_hash_file = False 599 if api.vars.upload_dm_results: 600 # This must run before we write anything into 601 # api.flavor.device_dirs.dm_dir or we may end up deleting our 602 # output on machines where they're the same. 603 api.flavor.create_clean_host_dir(api.vars.dm_dir) 604 host_dm_dir = str(api.vars.dm_dir) 605 device_dm_dir = str(api.flavor.device_dirs.dm_dir) 606 if host_dm_dir != device_dm_dir: 607 api.flavor.create_clean_device_dir(device_dm_dir) 608 609 # Obtain the list of already-generated hashes. 610 hash_filename = 'uninteresting_hashes.txt' 611 612 # Ensure that the tmp_dir exists. 613 api.run.run_once(api.file.ensure_directory, 614 'makedirs tmp_dir', 615 api.vars.tmp_dir) 616 617 host_hashes_file = api.vars.tmp_dir.join(hash_filename) 618 hashes_file = api.flavor.device_path_join( 619 api.flavor.device_dirs.tmp_dir, hash_filename) 620 api.run( 621 api.python.inline, 622 'get uninteresting hashes', 623 program=""" 624 import contextlib 625 import math 626 import socket 627 import sys 628 import time 629 import urllib2 630 631 HASHES_URL = 'https://storage.googleapis.com/skia-infra-gm/hash_files/gold-prod-hashes.txt' 632 RETRIES = 5 633 TIMEOUT = 60 634 WAIT_BASE = 15 635 636 socket.setdefaulttimeout(TIMEOUT) 637 for retry in range(RETRIES): 638 try: 639 with contextlib.closing( 640 urllib2.urlopen(HASHES_URL, timeout=TIMEOUT)) as w: 641 hashes = w.read() 642 with open(sys.argv[1], 'w') as f: 643 f.write(hashes) 644 break 645 except Exception as e: 646 print 'Failed to get uninteresting hashes from %s:' % HASHES_URL 647 print e 648 if retry == RETRIES: 649 raise 650 waittime = WAIT_BASE * math.pow(2, retry) 651 print 'Retry in %d seconds.' % waittime 652 time.sleep(waittime) 653 """, 654 args=[host_hashes_file], 655 abort_on_failure=False, 656 fail_build_on_failure=False, 657 infra_step=True) 658 659 if api.path.exists(host_hashes_file): 660 api.flavor.copy_file_to_device(host_hashes_file, hashes_file) 661 use_hash_file = True 662 663 # Run DM. 664 properties = [ 665 'gitHash', api.vars.got_revision, 666 'builder', api.vars.builder_name, 667 ] 668 if api.vars.is_trybot: 669 properties.extend([ 670 'issue', api.vars.issue, 671 'patchset', api.vars.patchset, 672 'patch_storage', api.vars.patch_storage, 673 ]) 674 properties.extend(['swarming_bot_id', api.vars.swarming_bot_id]) 675 properties.extend(['swarming_task_id', api.vars.swarming_task_id]) 676 677 args = [ 678 'dm', 679 '--undefok', # This helps branches that may not know new flags. 680 '--resourcePath', api.flavor.device_dirs.resource_dir, 681 '--skps', api.flavor.device_dirs.skp_dir, 682 '--images', api.flavor.device_path_join( 683 api.flavor.device_dirs.images_dir, 'dm'), 684 '--colorImages', api.flavor.device_path_join( 685 api.flavor.device_dirs.images_dir, 'colorspace'), 686 '--nameByHash', 687 '--properties' 688 ] + properties 689 690 args.extend(['--svgs', api.flavor.device_dirs.svg_dir]) 691 692 args.append('--key') 693 args.extend(key_params(api)) 694 if use_hash_file: 695 args.extend(['--uninterestingHashesFile', hashes_file]) 696 if api.vars.upload_dm_results: 697 args.extend(['--writePath', api.flavor.device_dirs.dm_dir]) 698 699 skip_flag = None 700 if api.vars.builder_cfg.get('cpu_or_gpu') == 'CPU': 701 skip_flag = '--nogpu' 702 elif api.vars.builder_cfg.get('cpu_or_gpu') == 'GPU': 703 skip_flag = '--nocpu' 704 if skip_flag: 705 args.append(skip_flag) 706 args.extend(dm_flags(api, api.vars.builder_name)) 707 708 env = {} 709 if 'Ubuntu16' in api.vars.builder_name: 710 # The vulkan in this asset name simply means that the graphics driver 711 # supports Vulkan. It is also the driver used for GL code. 712 dri_path = api.vars.slave_dir.join('linux_vulkan_intel_driver_release') 713 if 'Debug' in api.vars.builder_name: 714 dri_path = api.vars.slave_dir.join('linux_vulkan_intel_driver_debug') 715 716 if 'Vulkan' in api.vars.builder_name: 717 sdk_path = api.vars.slave_dir.join('linux_vulkan_sdk', 'bin') 718 lib_path = api.vars.slave_dir.join('linux_vulkan_sdk', 'lib') 719 env.update({ 720 'PATH':'%%(PATH)s:%s' % sdk_path, 721 'LD_LIBRARY_PATH': '%s:%s' % (lib_path, dri_path), 722 'LIBGL_DRIVERS_PATH': dri_path, 723 'VK_ICD_FILENAMES':'%s' % dri_path.join('intel_icd.x86_64.json'), 724 }) 725 else: 726 # Even the non-vulkan NUC jobs could benefit from the newer drivers. 727 env.update({ 728 'LD_LIBRARY_PATH': dri_path, 729 'LIBGL_DRIVERS_PATH': dri_path, 730 }) 731 732 # See skia:2789. 733 extra_config_parts = api.vars.builder_cfg.get('extra_config', '').split('_') 734 if 'AbandonGpuContext' in extra_config_parts: 735 args.append('--abandonGpuContext') 736 if 'PreAbandonGpuContext' in extra_config_parts: 737 args.append('--preAbandonGpuContext') 738 if 'ReleaseAndAbandonGpuContext' in extra_config_parts: 739 args.append('--releaseAndAbandonGpuContext') 740 741 with api.env(env): 742 api.run(api.flavor.step, 'dm', cmd=args, abort_on_failure=False) 743 744 if api.vars.upload_dm_results: 745 # Copy images and JSON to host machine if needed. 746 api.flavor.copy_directory_contents_to_host( 747 api.flavor.device_dirs.dm_dir, api.vars.dm_dir) 748 749 750def RunSteps(api): 751 api.core.setup() 752 env = {} 753 if 'iOS' in api.vars.builder_name: 754 env['IOS_BUNDLE_ID'] = 'com.google.dm' 755 env['IOS_MOUNT_POINT'] = api.vars.slave_dir.join('mnt_iosdevice') 756 with api.context(env=env): 757 try: 758 api.flavor.install_everything() 759 test_steps(api) 760 finally: 761 api.flavor.cleanup_steps() 762 api.run.check_failure() 763 764 765TEST_BUILDERS = [ 766 'Test-Android-Clang-AndroidOne-GPU-Mali400MP2-arm-Release-Android', 767 'Test-Android-Clang-Ci20-CPU-IngenicJZ4780-mipsel-Release-Android', 768 'Test-Android-Clang-GalaxyS6-GPU-MaliT760-arm64-Debug-Android', 769 'Test-Android-Clang-GalaxyS7_G930A-GPU-Adreno530-arm64-Debug-Android', 770 'Test-Android-Clang-NVIDIA_Shield-GPU-TegraX1-arm64-Debug-Android', 771 'Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Release-Android', 772 'Test-Android-Clang-Nexus5-GPU-Adreno330-arm-Release-Android', 773 'Test-Android-Clang-PixelXL-GPU-Adreno530-arm64-Debug-Android_CCPR', 774 'Test-Android-Clang-Nexus6p-GPU-Adreno430-arm64-Debug-Android_Vulkan', 775 'Test-Android-Clang-PixelXL-GPU-Adreno530-arm64-Debug-Android_Vulkan', 776 'Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-Android', 777 'Test-Android-Clang-NexusPlayer-CPU-SSE4-x86-Release-Android', 778 'Test-Android-Clang-NexusPlayer-GPU-PowerVR-x86-Release-Android_Vulkan', 779 'Test-Android-Clang-PixelC-CPU-TegraX1-arm64-Debug-Android', 780 'Test-ChromeOS-Clang-Chromebook_C100p-GPU-MaliT764-arm-Debug', 781 'Test-Mac-Clang-MacMini6.2-CPU-AVX-x86_64-Debug', 782 'Test-Mac-Clang-MacMini6.2-GPU-IntelHD4000-x86_64-Debug-CommandBuffer', 783 'Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug-ASAN', 784 'Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Debug-MSAN', 785 'Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-TSAN', 786 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86-Debug', 787 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug', 788 'Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind', 789 ('Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind' + 790 '_AbandonGpuContext'), 791 ('Test-Ubuntu-GCC-ShuttleA-GPU-GTX550Ti-x86_64-Release-Valgrind' + 792 '_PreAbandonGpuContext'), 793 ('Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug-SK_USE_DISCARDABLE_' + 794 'SCALEDIMAGECACHE'), 795 'Test-Ubuntu16-Clang-NUC5PPYH-GPU-IntelHD405-x86_64-Debug', 796 'Test-Ubuntu16-Clang-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-Vulkan', 797 'Test-Ubuntu16-Clang-NUC6i5SYK-GPU-IntelIris540-x86_64-Release', 798 'Test-Ubuntu16-Clang-NUCDE3815TYKHE-GPU-IntelBayTrail-x86_64-Debug', 799 'Test-Win8-MSVC-Golo-CPU-AVX-x86-Debug', 800 'Test-Win10-MSVC-AlphaR2-GPU-RadeonR9M470X-x86_64-Debug-Vulkan', 801 ('Test-Win10-MSVC-NUC5i7RYH-GPU-IntelIris6100-x86_64-Release-' 802 'ReleaseAndAbandonGpuContext'), 803 'Test-Win10-MSVC-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-ANGLE', 804 'Test-Win10-MSVC-NUC6i5SYK-GPU-IntelIris540-x86_64-Debug-Vulkan', 805 'Test-Win10-MSVC-ShuttleA-GPU-GTX660-x86_64-Debug-Vulkan', 806 'Test-Win10-MSVC-ShuttleC-GPU-GTX960-x86_64-Debug-ANGLE', 807 'Test-Win10-MSVC-ZBOX-GPU-GTX1070-x86_64-Debug-Vulkan', 808 'Test-iOS-Clang-iPadMini4-GPU-GX6450-arm-Release', 809 ('Test-Ubuntu-Clang-GCE-CPU-AVX2-x86_64-Release-' 810 'SK_FORCE_RASTER_PIPELINE_BLITTER'), 811] 812 813 814def GenTests(api): 815 for builder in TEST_BUILDERS: 816 test = ( 817 api.test(builder) + 818 api.properties(buildername=builder, 819 revision='abc123', 820 path_config='kitchen', 821 swarm_out_dir='[SWARM_OUT_DIR]') + 822 api.path.exists( 823 api.path['start_dir'].join('skia'), 824 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 825 'skimage', 'VERSION'), 826 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 827 'skp', 'VERSION'), 828 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 829 'svg', 'VERSION'), 830 api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') 831 ) + 832 api.step_data('get swarming bot id', 833 stdout=api.raw_io.output('skia-bot-123')) + 834 api.step_data('get swarming task id', 835 stdout=api.raw_io.output('123456')) 836 ) 837 if 'Win' in builder: 838 test += api.platform('win', 64) 839 840 if 'ChromeOS' in builder: 841 test += api.step_data( 842 'read chromeos ip', 843 stdout=api.raw_io.output('{"user_ip":"foo@127.0.0.1"}')) 844 845 846 yield test 847 848 builder = 'Test-Win2k8-MSVC-GCE-CPU-AVX2-x86_64-Release' 849 yield ( 850 api.test('trybot') + 851 api.properties(buildername=builder, 852 revision='abc123', 853 path_config='kitchen', 854 swarm_out_dir='[SWARM_OUT_DIR]') + 855 api.properties(patch_storage='gerrit') + 856 api.properties.tryserver( 857 buildername=builder, 858 gerrit_project='skia', 859 gerrit_url='https://skia-review.googlesource.com/', 860 )+ 861 api.path.exists( 862 api.path['start_dir'].join('skia'), 863 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 864 'skimage', 'VERSION'), 865 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 866 'skp', 'VERSION'), 867 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 868 'svg', 'VERSION'), 869 api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') 870 ) 871 ) 872 873 builder = 'Test-Ubuntu-GCC-GCE-CPU-AVX2-x86_64-Debug' 874 yield ( 875 api.test('failed_dm') + 876 api.properties(buildername=builder, 877 revision='abc123', 878 path_config='kitchen', 879 swarm_out_dir='[SWARM_OUT_DIR]') + 880 api.path.exists( 881 api.path['start_dir'].join('skia'), 882 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 883 'skimage', 'VERSION'), 884 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 885 'skp', 'VERSION'), 886 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 887 'svg', 'VERSION'), 888 api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') 889 ) + 890 api.step_data('symbolized dm', retcode=1) 891 ) 892 893 builder = 'Test-Android-Clang-Nexus7-GPU-Tegra3-arm-Debug-Android' 894 yield ( 895 api.test('failed_get_hashes') + 896 api.properties(buildername=builder, 897 revision='abc123', 898 path_config='kitchen', 899 swarm_out_dir='[SWARM_OUT_DIR]') + 900 api.path.exists( 901 api.path['start_dir'].join('skia'), 902 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 903 'skimage', 'VERSION'), 904 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 905 'skp', 'VERSION'), 906 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 907 'svg', 'VERSION'), 908 api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') 909 ) + 910 api.step_data('get uninteresting hashes', retcode=1) 911 ) 912 913 builder = 'Test-Android-Clang-NexusPlayer-CPU-SSE4-x86-Debug-Android' 914 yield ( 915 api.test('failed_push') + 916 api.properties(buildername=builder, 917 revision='abc123', 918 path_config='kitchen', 919 swarm_out_dir='[SWARM_OUT_DIR]') + 920 api.path.exists( 921 api.path['start_dir'].join('skia'), 922 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 923 'skimage', 'VERSION'), 924 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 925 'skp', 'VERSION'), 926 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 927 'svg', 'VERSION'), 928 api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') 929 ) + 930 api.step_data('push [START_DIR]/skia/resources/* '+ 931 '/sdcard/revenge_of_the_skiabot/resources', retcode=1) 932 ) 933 934 builder = 'Test-Android-Clang-Nexus10-GPU-MaliT604-arm-Debug-Android' 935 yield ( 936 api.test('failed_pull') + 937 api.properties(buildername=builder, 938 revision='abc123', 939 path_config='kitchen', 940 swarm_out_dir='[SWARM_OUT_DIR]') + 941 api.path.exists( 942 api.path['start_dir'].join('skia'), 943 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 944 'skimage', 'VERSION'), 945 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 946 'skp', 'VERSION'), 947 api.path['start_dir'].join('skia', 'infra', 'bots', 'assets', 948 'svg', 'VERSION'), 949 api.path['start_dir'].join('tmp', 'uninteresting_hashes.txt') 950 ) + 951 api.step_data('dm', retcode=1) + 952 api.step_data('pull /sdcard/revenge_of_the_skiabot/dm_out '+ 953 '[CUSTOM_[SWARM_OUT_DIR]]/dm', retcode=1) 954 ) 955