• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2020 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
5package gen_tasks_logic
6
7import (
8	"fmt"
9	"sort"
10	"strconv"
11	"strings"
12
13	"github.com/golang/glog"
14	"go.skia.org/infra/task_scheduler/go/specs"
15)
16
17// keyParams generates the key used by DM for Gold results.
18func keyParams(parts map[string]string) []string {
19	// Don't bother to include role, which is always Test.
20	ignored := []string{"role", "test_filter"}
21	keys := make([]string, 0, len(parts))
22	for key := range parts {
23		found := false
24		for _, b := range ignored {
25			if key == b {
26				found = true
27				break
28			}
29		}
30		if !found {
31			keys = append(keys, key)
32		}
33	}
34	sort.Strings(keys)
35	rv := make([]string, 0, 2*len(keys))
36	for _, key := range keys {
37		rv = append(rv, key, parts[key])
38	}
39	return rv
40}
41
42// dmFlags generates flags to DM based on the given task properties.
43func (b *taskBuilder) dmFlags(internalHardwareLabel string) {
44	properties := map[string]string{
45		"gitHash":              specs.PLACEHOLDER_REVISION,
46		"builder":              b.Name,
47		"buildbucket_build_id": specs.PLACEHOLDER_BUILDBUCKET_BUILD_ID,
48		"task_id":              specs.PLACEHOLDER_TASK_ID,
49		"issue":                specs.PLACEHOLDER_ISSUE,
50		"patchset":             specs.PLACEHOLDER_PATCHSET,
51		"patch_storage":        specs.PLACEHOLDER_PATCH_STORAGE,
52		"swarming_bot_id":      "${SWARMING_BOT_ID}",
53		"swarming_task_id":     "${SWARMING_TASK_ID}",
54	}
55
56	args := []string{
57		"dm",
58		"--nameByHash",
59	}
60
61	configs := []string{}
62	skipped := []string{}
63
64	hasConfig := func(cfg string) bool {
65		for _, c := range configs {
66			if c == cfg {
67				return true
68			}
69		}
70		return false
71	}
72	filter := func(slice []string, elems ...string) []string {
73		m := make(map[string]bool, len(elems))
74		for _, e := range elems {
75			m[e] = true
76		}
77		rv := make([]string, 0, len(slice))
78		for _, e := range slice {
79			if m[e] {
80				rv = append(rv, e)
81			}
82		}
83		return rv
84	}
85	remove := func(slice []string, elem string) []string {
86		rv := make([]string, 0, len(slice))
87		for _, e := range slice {
88			if e != elem {
89				rv = append(rv, e)
90			}
91		}
92		return rv
93	}
94	removeContains := func(slice []string, elem string) []string {
95		rv := make([]string, 0, len(slice))
96		for _, e := range slice {
97			if !strings.Contains(e, elem) {
98				rv = append(rv, e)
99			}
100		}
101		return rv
102	}
103	suffix := func(slice []string, sfx string) []string {
104		rv := make([]string, 0, len(slice))
105		for _, e := range slice {
106			rv = append(rv, e+sfx)
107		}
108		return rv
109	}
110
111	// When matching skip logic, _ is a wildcard that matches all parts for the field.
112	// For example, "8888 _ _ _" means everything that is part of an 8888 config and
113	// "_ skp _ SomeBigDraw" means the skp named SomeBigDraw on all config and options.
114	const ALL = "_"
115	// The inputs here are turned into a --skip flag which represents a
116	// "Space-separated config/src/srcOptions/name quadruples to skip."
117	// See DM.cpp for more, especially should_skip(). ~ negates the match.
118	skip := func(config, src, srcOptions, name string) {
119		// config is also called "sink" in DM
120		if config == "_" ||
121			hasConfig(config) ||
122			(config[0] == '~' && hasConfig(config[1:])) {
123			skipped = append(skipped, config, src, srcOptions, name)
124		}
125	}
126
127	// Keys.
128	keys := keyParams(b.parts)
129	if b.extraConfig("Lottie") {
130		keys = append(keys, "renderer", "skottie")
131	}
132	if b.matchExtraConfig("DDL") {
133		// 'DDL' style means "--skpViewportSize 2048"
134		keys = append(keys, "style", "DDL")
135	} else {
136		keys = append(keys, "style", "default")
137	}
138	args = append(args, "--key")
139	args = append(args, keys...)
140
141	// This enables non-deterministic random seeding of the GPU FP optimization
142	// test.
143	// Not Android due to:
144	//  - https://skia.googlesource.com/skia/+/5910ed347a638ded8cd4c06dbfda086695df1112/BUILD.gn#160
145	//  - https://skia.googlesource.com/skia/+/ce06e261e68848ae21cac1052abc16bc07b961bf/tests/ProcessorTest.cpp#307
146	// Not MSAN due to:
147	//  - https://skia.googlesource.com/skia/+/0ac06e47269a40c177747310a613d213c95d1d6d/infra/bots/recipe_modules/flavor/gn_flavor.py#80
148	if !b.matchOs("Android") && !b.extraConfig("MSAN") {
149		args = append(args, "--randomProcessorTest")
150	}
151
152	threadLimit := -1
153	const MAIN_THREAD_ONLY = 0
154
155	// 32-bit desktop machines tend to run out of memory, because they have relatively
156	// far more cores than RAM (e.g. 32 cores, 3G RAM).  Hold them back a bit.
157	if b.arch("x86") {
158		threadLimit = 4
159	}
160
161	// These devices run out of memory easily.
162	if b.model("MotoG4", "Nexus7") {
163		threadLimit = MAIN_THREAD_ONLY
164	}
165
166	// Avoid issues with dynamically exceeding resource cache limits.
167	if b.matchExtraConfig("DISCARDABLE") {
168		threadLimit = MAIN_THREAD_ONLY
169	}
170
171	if threadLimit >= 0 {
172		args = append(args, "--threads", strconv.Itoa(threadLimit))
173	}
174
175	sampleCount := 0
176	glPrefix := ""
177	if b.extraConfig("SwiftShader") {
178		configs = append(configs, "vk", "vkdmsaa")
179		// skbug.com/12826
180		skip(ALL, "test", ALL, "GrThreadSafeCache16Verts")
181		// b/296440036
182		skip(ALL, "test", ALL, "ImageAsyncReadPixels")
183		// skbug.com/12829
184		skip(ALL, "test", ALL, "image_subset")
185	} else if b.cpu() {
186		args = append(args, "--nogpu")
187
188		configs = append(configs, "8888")
189
190		if b.extraConfig("BonusConfigs") {
191			configs = []string{
192				"r8", "565",
193				"pic-8888", "serialize-8888"}
194		}
195
196		if b.extraConfig("PDF") {
197			configs = []string{"pdf"}
198			args = append(args, "--rasterize_pdf") // Works only on Mac.
199			// Take ~forever to rasterize:
200			skip("pdf", "gm", ALL, "lattice2")
201			skip("pdf", "gm", ALL, "hairmodes")
202			skip("pdf", "gm", ALL, "longpathdash")
203		}
204
205		if b.extraConfig("OldestSupportedSkpVersion") {
206			// For triaging convenience, make the old-skp job's output match the size of the DDL jobs' output
207			args = append(args, "--skpViewportSize", "2048")
208		}
209
210	} else if b.gpu() {
211		args = append(args, "--nocpu")
212
213		// Add in either gles or gl configs to the canonical set based on OS
214		glPrefix = "gl"
215		// Use 4x MSAA for all our testing. It's more consistent and 8x MSAA is nondeterministic (by
216		// design) on NVIDIA hardware. The problem is especially bad on ANGLE.  skia:6813 skia:6545
217		sampleCount = 4
218		if b.matchOs("Android") || b.os("iOS") {
219			glPrefix = "gles"
220			// MSAA is disabled on Pixel3a (https://b.corp.google.com/issues/143074513).
221			// MSAA is disabled on Pixel5 (https://skbug.com/11152).
222			if b.model("Pixel3a", "Pixel5") {
223				sampleCount = 0
224			}
225		} else if b.matchGpu("Intel") {
226			// MSAA doesn't work well on Intel GPUs chromium:527565, chromium:983926
227			if b.gpu("IntelIrisXe") && b.matchOs("Win") && b.extraConfig("ANGLE") {
228				// Make an exception for newer GPUs + D3D
229				args = append(args, "--allowMSAAOnNewIntel", "true")
230			} else {
231				sampleCount = 0
232			}
233		} else if b.os("ChromeOS") {
234			glPrefix = "gles"
235		}
236
237		if b.extraConfig("NativeFonts") {
238			configs = append(configs, glPrefix)
239		} else {
240			configs = append(configs, glPrefix, glPrefix+"dft")
241			if sampleCount > 0 {
242				configs = append(configs, fmt.Sprintf("%smsaa%d", glPrefix, sampleCount))
243				// Temporarily limit the machines we test dynamic MSAA on.
244				if b.gpu("QuadroP400", "MaliG77") || b.matchOs("Mac") {
245					configs = append(configs, fmt.Sprintf("%sdmsaa", glPrefix))
246				}
247			}
248		}
249
250		if b.extraConfig("Protected") {
251			args = append(args, "--createProtected")
252			// The Protected jobs (for now) only run the unit tests
253			skip(ALL, "gm", ALL, ALL)
254			skip(ALL, "image", ALL, ALL)
255			skip(ALL, "lottie", ALL, ALL)
256			skip(ALL, "colorImage", ALL, ALL)
257			skip(ALL, "svg", ALL, ALL)
258			skip(ALL, "skp", ALL, ALL)
259
260			// These unit tests attempt to readback
261			skip(ALL, "test", ALL, "ApplyGamma")
262			skip(ALL, "test", ALL, "BigImageTest_Ganesh")
263			skip(ALL, "test", ALL, "BigImageTest_Graphite")
264			skip(ALL, "test", ALL, "BlendRequiringDstReadWithLargeCoordinates")
265			skip(ALL, "test", ALL, "BlurMaskBiggerThanDest")
266			skip(ALL, "test", ALL, "ClearOp")
267			skip(ALL, "test", ALL, "ColorTypeBackendAllocationTest")
268			skip(ALL, "test", ALL, "ComposedImageFilterBounds_Gpu")
269			skip(ALL, "test", ALL, "CompressedBackendAllocationTest")
270			skip(ALL, "test", ALL, "CopySurface")
271			skip(ALL, "test", ALL, "crbug_1271431")
272			skip(ALL, "test", ALL, "DashPathEffectTest_2PiInterval")
273			skip(ALL, "test", ALL, "DeviceTestVertexTransparency")
274			skip(ALL, "test", ALL, "DDLMultipleDDLs")
275			skip(ALL, "test", ALL, "DefaultPathRendererTest")
276			skip(ALL, "test", ALL, "DMSAA_aa_dst_read_after_dmsaa")
277			skip(ALL, "test", ALL, "DMSAA_dst_read")
278			skip(ALL, "test", ALL, "DMSAA_dst_read_with_existing_barrier")
279			skip(ALL, "test", ALL, "DMSAA_dual_source_blend_disable")
280			skip(ALL, "test", ALL, "DMSAA_preserve_contents")
281			skip(ALL, "test", ALL, "EGLImageTest")
282			skip(ALL, "test", ALL, "ES2BlendWithNoTexture")
283			skip(ALL, "test", ALL, "ExtendedSkColorTypeTests_gpu")
284			skip(ALL, "test", ALL, "F16DrawTest")
285			skip(ALL, "test", ALL, "FilterResult_ganesh") // knocks out a bunch
286			skip(ALL, "test", ALL, "FullScreenClearWithLayers")
287			skip(ALL, "test", ALL, "GLBackendAllocationTest")
288			skip(ALL, "test", ALL, "GLReadPixelsUnbindPBO")
289			skip(ALL, "test", ALL, "GrAHardwareBuffer_BasicDrawTest")
290			skip(ALL, "test", ALL, "GrGpuBufferTransferTest")
291			skip(ALL, "test", ALL, "GrGpuBufferUpdateDataTest")
292			skip(ALL, "test", ALL, "GrMeshTest")
293			skip(ALL, "test", ALL, "GrPipelineDynamicStateTest")
294			skip(ALL, "test", ALL, "GrTextBlobScaleAnimation")
295			skip(ALL, "test", ALL, "HalfFloatAlphaTextureTest")
296			skip(ALL, "test", ALL, "HalfFloatRGBATextureTest")
297			skip(ALL, "test", ALL, "ImageAsyncReadPixels")
298			skip(ALL, "test", ALL, "ImageAsyncReadPixelsGraphite")
299			skip(ALL, "test", ALL, "ImageEncode_Gpu")
300			skip(ALL, "test", ALL, "ImageFilterFailAffectsTransparentBlack_Gpu")
301			skip(ALL, "test", ALL, "ImageFilterNegativeBlurSigma_Gpu")
302			skip(ALL, "test", ALL, "ImageFilterZeroBlurSigma_Gpu")
303			skip(ALL, "test", ALL, "ImageLegacyBitmap_Gpu")
304			skip(ALL, "test", ALL, "ImageNewShader_GPU")
305			skip(ALL, "test", ALL, "ImageOriginTest_drawImage_Graphite")
306			skip(ALL, "test", ALL, "ImageOriginTest_imageShader_Graphite")
307			skip(ALL, "test", ALL, "ImageProviderTest_Graphite_Default")
308			skip(ALL, "test", ALL, "ImageProviderTest_Graphite_Testing")
309			skip(ALL, "test", ALL, "ImageReadPixels_Gpu")
310			skip(ALL, "test", ALL, "ImageScalePixels_Gpu")
311			skip(ALL, "test", ALL, "ImageShaderTest")
312			skip(ALL, "test", ALL, "ImageWrapTextureMipmapsTest")
313			skip(ALL, "test", ALL, "MatrixColorFilter_TransparentBlack")
314			skip(ALL, "test", ALL, "MorphologyFilterRadiusWithMirrorCTM_Gpu")
315			skip(ALL, "test", ALL, "MultisampleRetainTest")
316			skip(ALL, "test", ALL, "MutableImagesTest")
317			skip(ALL, "test", ALL, "OpsTaskFlushCount")
318			skip(ALL, "test", ALL, "OverdrawSurface_Gpu")
319			skip(ALL, "test", ALL, "PinnedImageTest")
320			skip(ALL, "test", ALL, "RecordingOrderTest_Graphite")
321			skip(ALL, "test", ALL, "RecordingSurfacesTest")
322			skip(ALL, "test", ALL, "ReimportImageTextureWithMipLevels")
323			skip(ALL, "test", ALL, "ReplaceSurfaceBackendTexture")
324			skip(ALL, "test", ALL, "ResourceCacheCache")
325			skip(ALL, "test", ALL, "SaveLayerOrigin")
326			skip(ALL, "test", ALL, "ShaderTestNestedBlendsGanesh")
327			skip(ALL, "test", ALL, "ShaderTestNestedBlendsGraphite")
328			skip(ALL, "test", ALL, "skbug6653")
329			skip(ALL, "test", ALL, "SkImage_makeNonTextureImage")
330			skip(ALL, "test", ALL, "SkipCopyTaskTest")
331			skip(ALL, "test", ALL, "SkipOpsTaskTest")
332			skip(ALL, "test", ALL, "SkRuntimeBlender_GPU")
333			skip(ALL, "test", ALL, "SkRuntimeEffect") // knocks out a bunch
334			skip(ALL, "test", ALL, "SkRuntimeShaderImageFilter_GPU")
335			skip(ALL, "test", ALL, "SkSLCross")
336			skip(ALL, "test", ALL, "SkSL") // knocks out a bunch
337			skip(ALL, "test", ALL, "SpecialImage_Gpu")
338			skip(ALL, "test", ALL, "SRGBReadWritePixels")
339			skip(ALL, "test", ALL, "SurfaceAsyncReadPixels")
340			skip(ALL, "test", ALL, "SurfaceClear_Gpu")
341			skip(ALL, "test", ALL, "SurfaceContextReadPixels")
342			skip(ALL, "test", ALL, "SurfaceContextWritePixelsMipped")
343			skip(ALL, "test", ALL, "SurfaceDrawContextTest")
344			skip(ALL, "test", ALL, "SurfaceResolveTest")
345			skip(ALL, "test", ALL, "SurfaceSemaphores")
346			skip(ALL, "test", ALL, "TestSweepGradientZeroXGanesh")
347			skip(ALL, "test", ALL, "TiledDrawCacheTest_Ganesh")
348			skip(ALL, "test", ALL, "TiledDrawCacheTest_Graphite")
349			skip(ALL, "test", ALL, "UnpremulTextureImage")
350			skip(ALL, "test", ALL, "VkBackendAllocationTest")
351			skip(ALL, "test", ALL, "VkDrawableTest")
352			skip(ALL, "test", ALL, "VkDrawableImportTest")
353			skip(ALL, "test", ALL, "VkYCbcrSampler_DrawImageWithYcbcrSampler")
354			skip(ALL, "test", ALL, "WritePixels_Gpu")
355			skip(ALL, "test", ALL, "WritePixels_Graphite")
356			skip(ALL, "test", ALL, "WritePixelsMSAA_Gpu")
357			skip(ALL, "test", ALL, "WritePixelsNonTexture_Gpu")
358			skip(ALL, "test", ALL, "WritePixelsNonTextureMSAA_Gpu")
359			skip(ALL, "test", ALL, "WritePixelsPendingIO")
360			skip(ALL, "test", ALL, "XfermodeImageFilterCroppedInput_Gpu")
361
362			// These unit tests require some debugging (skbug.com/319229312)
363			skip(ALL, "test", ALL, "GrTextBlobMoveAround")          // a lot of AllocImageMemory failures
364			skip(ALL, "test", ALL, "Programs")                      // Perlin Noise FP violating protected constraints
365			skip(ALL, "test", ALL, "Protected_SmokeTest")           // Ganesh/Vulkan disallow creating Unprotected Image
366			skip(ALL, "test", ALL, "ReadOnlyTexture")               // crashes device!
367			skip(ALL, "test", ALL, "RepeatedClippedBlurTest")       // blurs not creating expected # of resources
368			skip(ALL, "test", ALL, "CharacterizationVkSCBnessTest") // DDL Validation failure for Vk SCBs
369
370			// These unit tests are very slow and probably don't benefit from Protected testing
371			skip(ALL, "test", ALL, "PaintParamsKeyTest")
372			skip(ALL, "test", ALL, "ProcessorCloneTest")
373			skip(ALL, "test", ALL, "ProcessorOptimizationValidationTest")
374			skip(ALL, "test", ALL, "TextBlobAbnormal")
375			skip(ALL, "test", ALL, "TextBlobStressAbnormal")
376
377			// b/399342221
378			skip(ALL, "test", ALL, "UserDefinedStableKeyTest")
379		}
380
381		// The Tegra3 doesn't support MSAA
382		if b.gpu("Tegra3") ||
383			// We aren't interested in fixing msaa bugs on current iOS devices.
384			b.model("iPad4", "iPadPro", "iPhone7") ||
385			// skia:5792
386			b.gpu("IntelHD530", "IntelIris540") {
387			configs = removeContains(configs, "msaa")
388		}
389
390		// We want to test both the OpenGL config and the GLES config on Linux Intel:
391		// GL is used by Chrome, GLES is used by ChromeOS.
392		if b.matchGpu("Intel") && b.isLinux() {
393			configs = append(configs, "gles", "glesdft")
394		}
395
396		// The FailFlushTimeCallbacks tasks only run the 'gl' config
397		if b.extraConfig("FailFlushTimeCallbacks") {
398			configs = []string{"gl"}
399		}
400
401		// Graphite task *only* runs the gr*** configs
402		if b.extraConfig("Graphite") {
403			args = append(args, "--nogpu") // disable non-Graphite tests
404
405			// This gm is just meant for local debugging
406			skip(ALL, "test", ALL, "PaintParamsKeyTestReduced")
407
408			if b.extraConfig("Dawn") {
409				baseConfig := ""
410				if b.extraConfig("D3D11") {
411					baseConfig = "grdawn_d3d11"
412				} else if b.extraConfig("D3D12") {
413					baseConfig = "grdawn_d3d12"
414				} else if b.extraConfig("Metal") {
415					baseConfig = "grdawn_mtl"
416				} else if b.extraConfig("Vulkan") {
417					baseConfig = "grdawn_vk"
418				} else if b.extraConfig("GL") {
419					baseConfig = "grdawn_gl"
420				} else if b.extraConfig("GLES") {
421					baseConfig = "grdawn_gles"
422				}
423
424				configs = []string{baseConfig}
425
426				if b.extraConfig("FakeWGPU") {
427					args = append(args, "--neverYieldToWebGPU")
428					args = append(args, "--useWGPUTextureView")
429				}
430
431				if b.extraConfig("TintIR") {
432					args = append(args, "--useTintIR")
433				}
434
435				// Shader doesn't compile
436				// https://skbug.com/14105
437				skip(ALL, "gm", ALL, "runtime_intrinsics_matrix")
438				// Crashes and failures
439				// https://skbug.com/14105
440				skip(ALL, "test", ALL, "BackendTextureTest")
441
442				if b.matchOs("Win10") || b.matchGpu("Adreno620", "MaliG78", "QuadroP400") {
443					// The Dawn Win10 and some Android/Linux device jobs OOMs (skbug.com/14410, b/318725123)
444					skip(ALL, "test", ALL, "BigImageTest_Graphite")
445				}
446				if b.matchGpu("Adreno620") {
447					// The Dawn Pixel5 device job fails one compute test (b/318725123)
448					skip(ALL, "test", ALL, "Compute_AtomicOperationsOverArrayAndStructTest")
449				}
450
451				if b.extraConfig("GL") || b.extraConfig("GLES") {
452					// These GMs currently have rendering issues in Dawn compat.
453					skip(ALL, "gm", ALL, "glyph_pos_n_s")
454					skip(ALL, "gm", ALL, "persptext")
455					skip(ALL, "gm", ALL, "persptext_minimal")
456					skip(ALL, "gm", ALL, "pictureshader_persp")
457					skip(ALL, "gm", ALL, "wacky_yuv_formats_frompixmaps")
458
459					// This GM is larger than Dawn compat's max texture size.
460					skip(ALL, "gm", ALL, "wacky_yuv_formats_domain")
461
462					// b/389701894 - The Dawn/GLES backend is hard crashing on this test
463					skip(ALL, "test", ALL, "ThreadedPipelineCompilePurgingTest")
464				}
465
466				// b/373845830 - Precompile isn't thread-safe on either Dawn Metal
467				// or Dawn Vulkan
468				skip(ALL, "test", ALL, "ThreadedPipelinePrecompileTest")
469				// b/380039123 getting both ASAN and TSAN failures for this test on Dawn
470				skip(ALL, "test", ALL, "ThreadedPipelinePrecompileCompileTest")
471				skip(ALL, "test", ALL, "ThreadedPipelinePrecompileCompilePurgingTest")
472
473				if b.extraConfig("Vulkan") {
474					if b.extraConfig("TSAN") {
475						// The TSAN_Graphite_Dawn_Vulkan job goes off into space on this test
476						skip(ALL, "test", ALL, "BigImageTest_Graphite")
477						// b/389706939 - Dawn/Vulkan reports a data race for LazyClearCountForTesting w/ TSAN
478						skip(ALL, "test", ALL, "ThreadedPipelineCompilePurgingTest")
479					}
480				}
481
482				if b.extraConfig("Metal") {
483					if b.extraConfig("TSAN") {
484						// b/389706939 - Dawn/Metal reports a data race for LazyClearCountForTesting w/ TSAN
485						skip(ALL, "test", ALL, "ThreadedPipelineCompilePurgingTest")
486						// The TSAN_Graphite_Dawn_Metal job seems to consistently get stuck on this unit test
487						skip(ALL, "test", ALL, "BigImageTest_Graphite")
488					}
489				}
490			} else if b.extraConfig("Native") {
491				if b.extraConfig("Metal") {
492					if b.extraConfig("TestPrecompile") {
493						configs = []string{"grmtltestprecompile"}
494					} else {
495						configs = []string{"grmtl"}
496					}
497
498					if b.gpu("IntelIrisPlus") {
499						// We get some 27/255 RGB diffs on the 45 degree
500						// rotation case on this device (skbug.com/14408)
501						skip(ALL, "test", ALL, "BigImageTest_Graphite")
502					}
503				}
504				if b.extraConfig("Vulkan") {
505					if b.extraConfig("TestPrecompile") {
506						configs = []string{"grvktestprecompile"}
507					} else {
508						configs = []string{"grvk"}
509					}
510
511					// Couldn't readback
512					skip(ALL, "gm", ALL, "aaxfermodes")
513					// Could not instantiate texture proxy for UploadTask!
514					skip(ALL, "test", ALL, "BigImageTest_Graphite")
515					// Test failures
516					skip(ALL, "test", ALL, "MultisampleRetainTest")
517					skip(ALL, "test", ALL, "PaintParamsKeyTest")
518					if b.matchOs("Android") {
519						// Currently broken on Android Vulkan (skbug.com/310180104)
520						skip(ALL, "test", ALL, "ImageAsyncReadPixelsGraphite")
521						skip(ALL, "test", ALL, "SurfaceAsyncReadPixelsGraphite")
522					}
523
524					// b/380049954 Graphite Native Vulkan has a thread race issue
525					skip(ALL, "test", ALL, "ThreadedPipelinePrecompileCompileTest")
526					skip(ALL, "test", ALL, "ThreadedPipelinePrecompileCompilePurgingTest")
527					skip(ALL, "test", ALL, "ThreadedPipelinePrecompilePurgingTest")
528				}
529			}
530		}
531
532		// ANGLE bot *only* runs the angle configs
533		if b.extraConfig("ANGLE") {
534			if b.matchOs("Win") {
535				configs = []string{"angle_d3d11_es2", "angle_d3d11_es3"}
536				if sampleCount > 0 {
537					configs = append(configs, fmt.Sprintf("angle_d3d11_es2_msaa%d", sampleCount))
538					configs = append(configs, fmt.Sprintf("angle_d3d11_es2_dmsaa"))
539					configs = append(configs, fmt.Sprintf("angle_d3d11_es3_msaa%d", sampleCount))
540					configs = append(configs, fmt.Sprintf("angle_d3d11_es3_dmsaa"))
541				}
542				if !b.matchGpu("GTX", "Quadro", "GT610") {
543					// See skia:10149
544					configs = append(configs, "angle_d3d9_es2")
545				}
546				if b.model("NUC5i7RYH") {
547					// skbug.com/7376
548					skip(ALL, "test", ALL, "ProcessorCloneTest")
549				}
550				if b.matchGpu("Intel") {
551					// Debug-ANGLE-All on Intel frequently timeout, and the FilterResult test suite
552					// produces many test cases, that are multiplied by the number of configs (of
553					// which ANGLE has many variations). There is not a lot of value gained by
554					// running these if they are the source of long 'dm' time on Xe hardware given
555					// many other tasks are executing them.
556					skip(ALL, "test", ALL, "FilterResult")
557				}
558			} else if b.matchOs("Mac") {
559				configs = []string{"angle_mtl_es2", "angle_mtl_es3"}
560
561				// anglebug.com/7245
562				skip("angle_mtl_es3", "gm", ALL, "runtime_intrinsics_common_es3")
563
564				if b.matchGpu("AppleM") {
565					// M1 Macs fail this test for sRGB color types
566					// skbug.com/13289
567					skip(ALL, "test", ALL, "TransferPixelsToTextureTest")
568				}
569			}
570		}
571
572		if b.model("AndroidOne", "Nexus5", "Nexus7", "JioNext") {
573			// skbug.com/9019
574			skip(ALL, "test", ALL, "ProcessorCloneTest")
575			skip(ALL, "test", ALL, "Programs")
576			skip(ALL, "test", ALL, "ProcessorOptimizationValidationTest")
577		}
578
579		if b.model("GalaxyS20") {
580			// skbug.com/10595
581			skip(ALL, "test", ALL, "ProcessorCloneTest")
582		}
583
584		if b.model("MotoG73") {
585			// https://g-issues.skia.org/issues/370739986
586			skip(ALL, "test", ALL, "SkSLSwizzleIndexStore_Ganesh")
587			skip(ALL, "test", ALL, "SkSLMatrixScalarMath_Ganesh")
588			skip(ALL, "test", ALL, "SkSLMatrixOpEqualsES3_Ganesh")
589			skip(ALL, "test", ALL, "SkSLMatrixScalarNoOpFolding_Ganesh")
590
591			skip(ALL, "test", ALL, "SkSLIncrementDisambiguation_Ganesh")
592			skip(ALL, "test", ALL, "SkSLArrayFolding_Ganesh")
593			skip(ALL, "test", ALL, "SkSLIntrinsicModf_Ganesh")
594		}
595
596		if b.model("MacMini8.1") && b.extraConfig("Metal") {
597			// https://g-issues.skia.org/issues/391573668
598			skip(ALL, "test", ALL, "SkSLIntrinsicAll_Graphite")
599			skip(ALL, "test", ALL, "SkSLIntrinsicAny_Graphite")
600			skip(ALL, "test", ALL, "SkSLIntrinsicNot_Graphite")
601			skip(ALL, "test", ALL, "SkSLIntrinsicMixFloatES3_Graphite")
602			skip(ALL, "test", ALL, "SkSLIntrinsicAll_Ganesh")
603			skip(ALL, "test", ALL, "SkSLIntrinsicAny_Ganesh")
604			skip(ALL, "test", ALL, "SkSLIntrinsicNot_Ganesh")
605			skip(ALL, "test", ALL, "SkSLIntrinsicMixFloatES3_Ganesh")
606		}
607
608		if b.model("Spin513") {
609			// skbug.com/11876
610			skip(ALL, "test", ALL, "Programs")
611			// skbug.com/12486
612			skip(ALL, "test", ALL, "TestMockContext")
613			skip(ALL, "test", ALL, "TestGpuRenderingContexts")
614			skip(ALL, "test", ALL, "TestGpuAllContexts")
615			skip(ALL, "test", ALL, "TextBlobCache")
616			skip(ALL, "test", ALL, "OverdrawSurface_Gpu")
617			skip(ALL, "test", ALL, "ReplaceSurfaceBackendTexture")
618			skip(ALL, "test", ALL, "SurfaceAttachStencil_Gpu")
619			skip(ALL, "test", ALL, "SurfacePartialDraw_Gpu")
620			skip(ALL, "test", ALL, "SurfaceWrappedWithRelease_Gpu")
621		}
622
623		// skbug.com/9043 - these devices render this test incorrectly
624		// when opList splitting reduction is enabled
625		if b.gpu() && b.extraConfig("Vulkan") && (b.gpu("RadeonR9M470X", "RadeonHD7770")) {
626			skip(ALL, "tests", ALL, "VkDrawableImportTest")
627		}
628		if b.extraConfig("Vulkan") && !b.extraConfig("Graphite") {
629			configs = []string{"vk"}
630			// MSAA doesn't work well on Intel GPUs chromium:527565, chromium:983926, skia:9023
631			// MSAA4 is not supported on the MotoG73
632			//     "Configuration 'vkmsaa4' sample count 4 is not a supported sample count."
633			if !b.matchGpu("Intel") && !b.model("MotoG73") {
634				configs = append(configs, "vkmsaa4")
635			}
636			// Temporarily limit the machines we test dynamic MSAA on.
637			if b.gpu("QuadroP400", "MaliG77") && !b.extraConfig("TSAN") {
638				configs = append(configs, "vkdmsaa")
639			}
640		}
641		if b.extraConfig("Metal") && !b.extraConfig("Graphite") {
642			configs = []string{"mtl"}
643			// MSAA doesn't work well on Intel GPUs chromium:527565, chromium:983926
644			if !b.matchGpu("Intel") {
645				configs = append(configs, "mtlmsaa4")
646			}
647		}
648		if b.extraConfig("Slug") {
649			// Test slug drawing
650			configs = []string{"glslug", "glserializeslug", "glremoteslug"}
651			// glremoteslug does not handle layers right. Exclude the tests for now.
652			skip("glremoteslug", "gm", ALL, "rtif_distort")
653			skip("glremoteslug", "gm", ALL, "textfilter_image")
654			skip("glremoteslug", "gm", ALL, "textfilter_color")
655			skip("glremoteslug", "gm", ALL, "savelayerpreservelcdtext")
656			skip("glremoteslug", "gm", ALL, "typefacerendering_pfa")
657			skip("glremoteslug", "gm", ALL, "typefacerendering_pfb")
658			skip("glremoteslug", "gm", ALL, "typefacerendering")
659		}
660		if b.extraConfig("Direct3D") {
661			configs = []string{"d3d"}
662		}
663
664		// Test 1010102 on our Linux/NVIDIA tasks and the persistent cache config
665		// on the GL tasks.
666		if b.gpu("QuadroP400") && !b.extraConfig("PreAbandonGpuContext") && !b.extraConfig("TSAN") && b.isLinux() &&
667			!b.extraConfig("FailFlushTimeCallbacks") && !b.extraConfig("Graphite") {
668			if b.extraConfig("Vulkan") {
669				configs = append(configs, "vk1010102")
670				// Decoding transparent images to 1010102 just looks bad
671				skip("vk1010102", "image", ALL, ALL)
672			} else {
673				configs = append(configs, "gl1010102", "gltestpersistentcache", "gltestglslcache", "gltestprecompile")
674				// Decoding transparent images to 1010102 just looks bad
675				skip("gl1010102", "image", ALL, ALL)
676				// These tests produce slightly different pixels run to run on NV.
677				skip("gltestpersistentcache", "gm", ALL, "atlastext")
678				skip("gltestpersistentcache", "gm", ALL, "dftext")
679				skip("gltestpersistentcache", "gm", ALL, "glyph_pos_h_b")
680				skip("gltestpersistentcache", "gm", ALL, "glyph_pos_h_f")
681				skip("gltestpersistentcache", "gm", ALL, "glyph_pos_n_f")
682				skip("gltestglslcache", "gm", ALL, "atlastext")
683				skip("gltestglslcache", "gm", ALL, "dftext")
684				skip("gltestglslcache", "gm", ALL, "glyph_pos_h_b")
685				skip("gltestglslcache", "gm", ALL, "glyph_pos_h_f")
686				skip("gltestglslcache", "gm", ALL, "glyph_pos_n_f")
687				skip("gltestprecompile", "gm", ALL, "atlastext")
688				skip("gltestprecompile", "gm", ALL, "dftext")
689				skip("gltestprecompile", "gm", ALL, "glyph_pos_h_b")
690				skip("gltestprecompile", "gm", ALL, "glyph_pos_h_f")
691				skip("gltestprecompile", "gm", ALL, "glyph_pos_n_f")
692				// Tessellation shaders do not yet participate in the persistent cache.
693				skip("gltestpersistentcache", "gm", ALL, "tessellation")
694				skip("gltestglslcache", "gm", ALL, "tessellation")
695				skip("gltestprecompile", "gm", ALL, "tessellation")
696			}
697		}
698
699		// We also test the SkSL precompile config on Pixel2XL as a representative
700		// Android device - this feature is primarily used by Flutter.
701		if b.model("Pixel2XL") && !b.extraConfig("Vulkan") {
702			configs = append(configs, "glestestprecompile")
703		}
704
705		// Test SkSL precompile on iPhone 8 as representative iOS device
706		if b.model("iPhone8") && b.extraConfig("Metal") {
707			configs = append(configs, "mtltestprecompile")
708			// avoid tests that can generate slightly different pixels per run
709			skip("mtltestprecompile", "gm", ALL, "atlastext")
710			skip("mtltestprecompile", "gm", ALL, "circular_arcs_hairline")
711			skip("mtltestprecompile", "gm", ALL, "dashcircle")
712			skip("mtltestprecompile", "gm", ALL, "dftext")
713			skip("mtltestprecompile", "gm", ALL, "encode-platform")
714			skip("mtltestprecompile", "gm", ALL, "fontmgr_bounds")
715			skip("mtltestprecompile", "gm", ALL, "fontmgr_bounds_1_-0.25")
716			skip("mtltestprecompile", "gm", ALL, "glyph_pos_h_b")
717			skip("mtltestprecompile", "gm", ALL, "glyph_pos_h_f")
718			skip("mtltestprecompile", "gm", ALL, "glyph_pos_n_f")
719			skip("mtltestprecompile", "gm", ALL, "persp_images")
720			skip("mtltestprecompile", "gm", ALL, "ovals")
721			skip("mtltestprecompile", "gm", ALL, "roundrects")
722			skip("mtltestprecompile", "gm", ALL, "shadow_utils_occl")
723			skip("mtltestprecompile", "gm", ALL, "strokedlines")
724			skip("mtltestprecompile", "gm", ALL, "strokerect")
725			skip("mtltestprecompile", "gm", ALL, "strokes3")
726			skip("mtltestprecompile", "gm", ALL, "texel_subset_linear_mipmap_nearest_down")
727			skip("mtltestprecompile", "gm", ALL, "texel_subset_linear_mipmap_linear_down")
728			skip("mtltestprecompile", "gm", ALL, "textblobmixedsizes_df")
729			skip("mtltestprecompile", "gm", ALL, "yuv420_odd_dim_repeat")
730			skip("mtltestprecompile", "svg", ALL, "A_large_blank_world_map_with_oceans_marked_in_blue.svg")
731			skip("mtltestprecompile", "svg", ALL, "Chalkboard.svg")
732			skip("mtltestprecompile", "svg", ALL, "Ghostscript_Tiger.svg")
733			skip("mtltestprecompile", "svg", ALL, "Seal_of_American_Samoa.svg")
734			skip("mtltestprecompile", "svg", ALL, "Seal_of_Illinois.svg")
735			skip("mtltestprecompile", "svg", ALL, "cartman.svg")
736			skip("mtltestprecompile", "svg", ALL, "desk_motionmark_paths.svg")
737			skip("mtltestprecompile", "svg", ALL, "rg1024_green_grapes.svg")
738			skip("mtltestprecompile", "svg", ALL, "shapes-intro-02-f.svg")
739			skip("mtltestprecompile", "svg", ALL, "tiger-8.svg")
740		}
741		// Test reduced shader mode on iPhone 11 as representative iOS device
742		if b.model("iPhone11") && b.extraConfig("Metal") && !b.extraConfig("Graphite") {
743			configs = append(configs, "mtlreducedshaders")
744		}
745
746		if b.model(DONT_REDUCE_OPS_TASK_SPLITTING_MODELS...) {
747			args = append(args, "--dontReduceOpsTaskSplitting", "true")
748		}
749
750		// Test reduceOpsTaskSplitting fallback when over budget.
751		if b.model("NUC7i5BNK") && b.extraConfig("ASAN") {
752			args = append(args, "--gpuResourceCacheLimit", "16777216")
753		}
754
755		// Test rendering to wrapped dsts on a few tasks
756		if b.extraConfig("BonusConfigs") {
757			configs = []string{"glbetex", "glbert", "glreducedshaders", "glr8"}
758		}
759
760		if b.os("ChromeOS") {
761			// Just run GLES for now - maybe add gles_msaa4 in the future
762			configs = []string{"gles"}
763		}
764
765		// Test GPU tessellation path renderer.
766		if b.extraConfig("GpuTess") {
767			configs = []string{glPrefix + "msaa4"}
768			// Use fixed count tessellation path renderers as much as possible.
769			args = append(args, "--pr", "atlas", "tess")
770		}
771
772		// DDL is a GPU-only feature
773		if b.extraConfig("DDL1") {
774			// This bot generates comparison images for the large skps and the gms
775			configs = filter(configs, "gl", "vk", "mtl")
776			args = append(args, "--skpViewportSize", "2048")
777		}
778		if b.extraConfig("DDL3") {
779			// This bot generates the real ddl images for the large skps and the gms
780			configs = suffix(filter(configs, "gl", "vk", "mtl"), "ddl")
781			args = append(args, "--skpViewportSize", "2048")
782			args = append(args, "--gpuThreads", "0")
783		}
784	}
785
786	if b.matchExtraConfig("ColorSpaces") {
787		// Here we're going to generate a bunch of configs with the format:
788		//        <colorspace> <backend> <targetFormat>
789		// Where: <colorspace> is one of:   "", "linear-", "narrow-", p3-", "rec2020-", "srgb2-"
790		//        <backend> is one of: "gl, "gles", "mtl", "vk"
791		//                             their "gr" prefixed versions
792		//                             and "" (for raster)
793		//        <targetFormat> is one of: "f16", { "" (for gpus) or "rgba" (for raster) }
794		//
795		// We also add on two configs with the format:
796		//        narrow-<backend>f16norm
797		//        linear-<backend>srgba
798		colorSpaces := []string{"", "linear-", "narrow-", "p3-", "rec2020-", "srgb2-"}
799
800		backendStr := ""
801		if b.gpu() {
802			if b.extraConfig("Graphite") {
803				if b.extraConfig("GL") {
804					backendStr = "grgl"
805				} else if b.extraConfig("GLES") {
806					backendStr = "grgles"
807				} else if b.extraConfig("Metal") {
808					backendStr = "grmtl"
809				} else if b.extraConfig("Vulkan") {
810					backendStr = "grvk"
811				}
812			} else {
813				if b.extraConfig("GL") {
814					backendStr = "gl"
815				} else if b.extraConfig("GLES") {
816					backendStr = "gles"
817				} else if b.extraConfig("Metal") {
818					backendStr = "mtl"
819				} else if b.extraConfig("Vulkan") {
820					backendStr = "vk"
821				}
822			}
823		}
824
825		targetFormats := []string{"f16"}
826		if b.gpu() {
827			targetFormats = append(targetFormats, "")
828		} else {
829			targetFormats = append(targetFormats, "rgba")
830		}
831
832		configs = []string{}
833
834		for _, cs := range colorSpaces {
835			for _, tf := range targetFormats {
836				configs = append(configs, cs+backendStr+tf)
837			}
838		}
839
840		configs = append(configs, "narrow-"+backendStr+"f16norm")
841		configs = append(configs, "linear-"+backendStr+"srgba")
842	}
843
844	// Sharding.
845	tf := b.parts["test_filter"]
846	if tf != "" && tf != "All" {
847		// Expected format: shard_XX_YY
848		split := strings.Split(tf, ALL)
849		if len(split) == 3 {
850			args = append(args, "--shard", split[1])
851			args = append(args, "--shards", split[2])
852		} else {
853			glog.Fatalf("Invalid task name - bad shards: %s", tf)
854		}
855	}
856
857	args = append(args, "--config")
858	args = append(args, configs...)
859
860	removeFromArgs := func(arg string) {
861		args = remove(args, arg)
862	}
863
864	// Run tests, gms, and image decoding tests everywhere.
865	args = append(args, "--src", "tests", "gm", "image", "lottie", "colorImage", "svg", "skp")
866	if b.gpu() {
867		// Don't run the "svgparse_*" svgs on GPU.
868		skip(ALL, "svg", ALL, "svgparse_")
869	} else if b.Name == "Test-Debian10-Clang-GCE-CPU-AVX2-x86_64-Debug-All-ASAN" {
870		// Only run the CPU SVGs on 8888.
871		skip("~8888", "svg", ALL, ALL)
872	} else {
873		// On CPU SVGs we only care about parsing. Only run them on the above bot.
874		removeFromArgs("svg")
875	}
876
877	// Eventually I'd like these to pass, but for now just skip 'em.
878	if b.extraConfig("SK_FORCE_RASTER_PIPELINE_BLITTER") {
879		removeFromArgs("tests")
880	}
881
882	if b.model("Spin513") {
883		removeFromArgs("tests")
884	}
885
886	if b.extraConfig("NativeFonts") { // images won't exercise native font integration :)
887		removeFromArgs("image")
888		removeFromArgs("colorImage")
889	}
890
891	if b.matchExtraConfig("Graphite") {
892		removeFromArgs("image")
893		removeFromArgs("lottie")
894		removeFromArgs("colorImage")
895		removeFromArgs("svg")
896	}
897
898	if b.matchExtraConfig("Fontations") {
899		// The only fontations code is exercised via gms and tests
900		removeFromArgs("image")
901		removeFromArgs("lottie")
902		removeFromArgs("colorImage")
903		removeFromArgs("svg")
904	}
905
906	// Remove skps for all tasks except for a select few. On tasks that will run SKPs remove some of
907	// their other tests.
908	if b.matchExtraConfig("DDL", "PDF") {
909		// The DDL and PDF tasks just render the large skps and the gms
910		removeFromArgs("tests")
911		removeFromArgs("image")
912		removeFromArgs("colorImage")
913		removeFromArgs("svg")
914	} else if b.matchExtraConfig("OldestSupportedSkpVersion") {
915		// The OldestSupportedSkpVersion bot only renders skps.
916		removeFromArgs("tests")
917		removeFromArgs("gm")
918		removeFromArgs("image")
919		removeFromArgs("colorImage")
920		removeFromArgs("svg")
921	} else if b.matchExtraConfig("FailFlushTimeCallbacks") {
922		// The FailFlushTimeCallbacks bot only runs skps, gms and svgs
923		removeFromArgs("tests")
924		removeFromArgs("image")
925		removeFromArgs("colorImage")
926	} else if b.extraConfig("Protected") {
927		// Currently the Protected jobs only run the unit tests
928		removeFromArgs("gm")
929		removeFromArgs("image")
930		removeFromArgs("lottie")
931		removeFromArgs("colorImage")
932		removeFromArgs("svg")
933		removeFromArgs("skp")
934	} else {
935		// No other tasks render the .skps.
936		removeFromArgs("skp")
937	}
938
939	if b.extraConfig("Lottie") {
940		// Only run the lotties on Lottie tasks.
941		removeFromArgs("tests")
942		removeFromArgs("gm")
943		removeFromArgs("image")
944		removeFromArgs("colorImage")
945		removeFromArgs("svg")
946		removeFromArgs("skp")
947	} else {
948		removeFromArgs("lottie")
949	}
950
951	if b.extraConfig("TSAN") {
952		// skbug.com/10848
953		removeFromArgs("svg")
954		// skbug.com/12900 avoid OOM on
955		//   Test-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-TSAN_Vulkan
956		// Avoid lots of spurious TSAN failures on
957		//   Test-Debian11-Clang-NUC11TZi5-GPU-IntelIrisXe-x86_64-Release-All-TSAN_Vulkan
958		//   Test-Debian11-Clang-NUC11TZi5-GPU-IntelIrisXe-x86_64-Release-All-DDL3_TSAN_Vulkan
959		if b.Name == "Test-Ubuntu18-Clang-Golo-GPU-QuadroP400-x86_64-Release-All-TSAN_Vulkan" ||
960			b.Name == "Test-Debian11-Clang-NUC11TZi5-GPU-IntelIrisXe-x86_64-Release-All-TSAN_Vulkan" ||
961			b.Name == "Test-Debian11-Clang-NUC11TZi5-GPU-IntelIrisXe-x86_64-Release-All-DDL3_TSAN_Vulkan" {
962			skip("_", "test", "_", "_")
963		}
964	}
965
966	// TODO: ???
967	skip("f16", ALL, ALL, "dstreadshuffle")
968
969	// --src image --config r8 means "decode into R8", which isn't supported.
970	skip("r8", "image", ALL, ALL)
971	skip("r8", "colorImage", ALL, ALL)
972
973	if b.extraConfig("Valgrind") {
974		// These take 18+ hours to run.
975		skip("pdf", "gm", ALL, "fontmgr_iter")
976		skip("pdf", ALL, ALL, "PANO_20121023_214540.jpg")
977		skip("pdf", "skp", ALL, "worldjournal")
978		skip("pdf", "skp", ALL, "desk_baidu.skp")
979		skip("pdf", "skp", ALL, "desk_wikipedia.skp")
980		skip(ALL, "svg", ALL, ALL)
981		// skbug.com/9171 and 8847
982		skip(ALL, "test", ALL, "InitialTextureClear")
983	}
984
985	if b.model("TecnoSpark3Pro", "Wembley") {
986		// skbug.com/9421
987		skip(ALL, "test", ALL, "InitialTextureClear")
988	}
989
990	if b.model("Wembley", "JioNext") {
991		// These tests run forever on the Wembley.
992		skip(ALL, "gm", ALL, "async_rescale_and_read")
993	}
994
995	if b.model("Wembley") {
996		// These tests run forever or use too many resources on the Wembley.
997		skip(ALL, "gm", ALL, "wacky_yuv_formats")
998		skip(ALL, "gm", ALL, "wacky_yuv_formats_cs")
999		skip(ALL, "gm", ALL, "wacky_yuv_formats_cubic")
1000		skip(ALL, "gm", ALL, "wacky_yuv_formats_domain")
1001		skip(ALL, "gm", ALL, "wacky_yuv_formats_fromimages")
1002		skip(ALL, "gm", ALL, "wacky_yuv_formats_frompixmaps")
1003		skip(ALL, "gm", ALL, "wacky_yuv_formats_imggen")
1004		skip(ALL, "gm", ALL, "wacky_yuv_formats_limited")
1005		skip(ALL, "gm", ALL, "wacky_yuv_formats_limited_cs")
1006		skip(ALL, "gm", ALL, "wacky_yuv_formats_limited_fromimages")
1007	}
1008
1009	if b.os("iOS") {
1010		skip(glPrefix, "skp", ALL, ALL)
1011	}
1012
1013	if b.matchOs("Mac", "iOS") {
1014		// CG fails on questionable bmps
1015		skip(ALL, "image", "gen_platf", "rgba32abf.bmp")
1016		skip(ALL, "image", "gen_platf", "rgb24prof.bmp")
1017		skip(ALL, "image", "gen_platf", "rgb24lprof.bmp")
1018		skip(ALL, "image", "gen_platf", "8bpp-pixeldata-cropped.bmp")
1019		skip(ALL, "image", "gen_platf", "4bpp-pixeldata-cropped.bmp")
1020		skip(ALL, "image", "gen_platf", "32bpp-pixeldata-cropped.bmp")
1021		skip(ALL, "image", "gen_platf", "24bpp-pixeldata-cropped.bmp")
1022
1023		// CG has unpredictable behavior on this questionable gif
1024		// It's probably using uninitialized memory
1025		skip(ALL, "image", "gen_platf", "frame_larger_than_image.gif")
1026
1027		// CG has unpredictable behavior on incomplete pngs
1028		// skbug.com/5774
1029		skip(ALL, "image", "gen_platf", "inc0.png")
1030		skip(ALL, "image", "gen_platf", "inc1.png")
1031		skip(ALL, "image", "gen_platf", "inc2.png")
1032		skip(ALL, "image", "gen_platf", "inc3.png")
1033		skip(ALL, "image", "gen_platf", "inc4.png")
1034		skip(ALL, "image", "gen_platf", "inc5.png")
1035		skip(ALL, "image", "gen_platf", "inc6.png")
1036		skip(ALL, "image", "gen_platf", "inc7.png")
1037		skip(ALL, "image", "gen_platf", "inc8.png")
1038		skip(ALL, "image", "gen_platf", "inc9.png")
1039		skip(ALL, "image", "gen_platf", "inc10.png")
1040		skip(ALL, "image", "gen_platf", "inc11.png")
1041		skip(ALL, "image", "gen_platf", "inc12.png")
1042		skip(ALL, "image", "gen_platf", "inc13.png")
1043		skip(ALL, "image", "gen_platf", "inc14.png")
1044		skip(ALL, "image", "gen_platf", "incInterlaced.png")
1045
1046		// These images fail after Mac 10.13.1 upgrade.
1047		skip(ALL, "image", "gen_platf", "incInterlaced.gif")
1048		skip(ALL, "image", "gen_platf", "inc1.gif")
1049		skip(ALL, "image", "gen_platf", "inc0.gif")
1050		skip(ALL, "image", "gen_platf", "butterfly.gif")
1051	}
1052
1053	// WIC fails on questionable bmps
1054	if b.matchOs("Win") {
1055		skip(ALL, "image", "gen_platf", "pal8os2v2.bmp")
1056		skip(ALL, "image", "gen_platf", "pal8os2v2-16.bmp")
1057		skip(ALL, "image", "gen_platf", "rgba32abf.bmp")
1058		skip(ALL, "image", "gen_platf", "rgb24prof.bmp")
1059		skip(ALL, "image", "gen_platf", "rgb24lprof.bmp")
1060		skip(ALL, "image", "gen_platf", "8bpp-pixeldata-cropped.bmp")
1061		skip(ALL, "image", "gen_platf", "4bpp-pixeldata-cropped.bmp")
1062		skip(ALL, "image", "gen_platf", "32bpp-pixeldata-cropped.bmp")
1063		skip(ALL, "image", "gen_platf", "24bpp-pixeldata-cropped.bmp")
1064		if b.arch("x86_64") && b.cpu() {
1065			// This GM triggers a SkSmallAllocator assert.
1066			skip(ALL, "gm", ALL, "composeshader_bitmap")
1067		}
1068	}
1069
1070	if !b.matchOs("Win", "Debian11", "Ubuntu18") || b.gpu("IntelIris655", "IntelIris540") {
1071		// This test requires a decent max texture size so just run it on the desktops.
1072		// The OS list should include Mac but Mac10.13 doesn't work correctly.
1073		// The IntelIris655 and IntelIris540 GPUs don't work correctly in the Vk backend
1074		skip(ALL, "test", ALL, "BigImageTest_Ganesh")
1075	}
1076
1077	if b.matchOs("Win", "Mac") {
1078		// WIC and CG fail on arithmetic jpegs
1079		skip(ALL, "image", "gen_platf", "testimgari.jpg")
1080		// More questionable bmps that fail on Mac, too. skbug.com/6984
1081		skip(ALL, "image", "gen_platf", "rle8-height-negative.bmp")
1082		skip(ALL, "image", "gen_platf", "rle4-height-negative.bmp")
1083	}
1084
1085	if b.matchOs("Mac14") {
1086		// These images are very large
1087		skip(ALL, "image", "gen_platf", "rgb24largepal.bmp")
1088		skip(ALL, "image", "gen_platf", "pal8oversizepal.bmp")
1089	}
1090
1091	// These PNGs have CRC errors. The platform generators seem to draw
1092	// uninitialized memory without reporting an error, so skip them to
1093	// avoid lots of images on Gold.
1094	skip(ALL, "image", "gen_platf", "error")
1095
1096	if b.matchOs("Android") || b.os("iOS") {
1097		// This test crashes the N9 (perhaps because of large malloc/frees). It also
1098		// is fairly slow and not platform-specific. So we just disable it on all of
1099		// Android and iOS. skia:5438
1100		skip(ALL, "test", ALL, "GrStyledShape")
1101	}
1102
1103	if internalHardwareLabel == "5" {
1104		// http://b/118312149#comment9
1105		skip(ALL, "test", ALL, "SRGBReadWritePixels")
1106	}
1107
1108	// skia:4095
1109	badSerializeGMs := []string{
1110		"strict_constraint_batch_no_red_allowed", // https://crbug.com/skia/10278
1111		"strict_constraint_no_red_allowed",       // https://crbug.com/skia/10278
1112		"fast_constraint_red_is_allowed",         // https://crbug.com/skia/10278
1113		"c_gms",
1114		"colortype",
1115		"colortype_xfermodes",
1116		"drawfilter",
1117		"fontmgr_bounds_0.75_0",
1118		"fontmgr_bounds_1_-0.25",
1119		"fontmgr_bounds",
1120		"fontmgr_match",
1121		"fontmgr_iter",
1122		"imagemasksubset",
1123		"wacky_yuv_formats_domain",
1124		"imagemakewithfilter",
1125		"imagemakewithfilter_crop",
1126		"imagemakewithfilter_crop_ref",
1127		"imagemakewithfilter_ref",
1128		"imagefilterstransformed",
1129	}
1130
1131	// skia:5589
1132	badSerializeGMs = append(badSerializeGMs,
1133		"bitmapfilters",
1134		"bitmapshaders",
1135		"convex_poly_clip",
1136		"extractalpha",
1137		"filterbitmap_checkerboard_32_32_g8",
1138		"filterbitmap_image_mandrill_64",
1139		"shadows",
1140		"simpleaaclip_aaclip",
1141	)
1142
1143	// skia:5595
1144	badSerializeGMs = append(badSerializeGMs,
1145		"composeshader_bitmap",
1146		"scaled_tilemodes_npot",
1147		"scaled_tilemodes",
1148	)
1149
1150	// skia:5778
1151	badSerializeGMs = append(badSerializeGMs, "typefacerendering_pfaMac")
1152	// skia:5942
1153	badSerializeGMs = append(badSerializeGMs, "parsedpaths")
1154
1155	// these use a custom image generator which doesn't serialize
1156	badSerializeGMs = append(badSerializeGMs, "ImageGeneratorExternal_rect")
1157	badSerializeGMs = append(badSerializeGMs, "ImageGeneratorExternal_shader")
1158
1159	// skia:6189
1160	badSerializeGMs = append(badSerializeGMs, "shadow_utils")
1161	badSerializeGMs = append(badSerializeGMs, "graphitestart")
1162
1163	// skia:7938
1164	badSerializeGMs = append(badSerializeGMs, "persp_images")
1165
1166	// Not expected to round trip encoding/decoding.
1167	badSerializeGMs = append(badSerializeGMs, "all_bitmap_configs")
1168	badSerializeGMs = append(badSerializeGMs, "makecolorspace")
1169	badSerializeGMs = append(badSerializeGMs, "readpixels")
1170	badSerializeGMs = append(badSerializeGMs, "draw_image_set_rect_to_rect")
1171	badSerializeGMs = append(badSerializeGMs, "draw_image_set_alpha_only")
1172	badSerializeGMs = append(badSerializeGMs, "compositor_quads_shader")
1173	badSerializeGMs = append(badSerializeGMs, "wacky_yuv_formats_qtr")
1174	badSerializeGMs = append(badSerializeGMs, "runtime_effect_image")
1175	badSerializeGMs = append(badSerializeGMs, "ctmpatheffect")
1176	badSerializeGMs = append(badSerializeGMs, "image_out_of_gamut")
1177
1178	// This GM forces a path to be convex. That property doesn't survive
1179	// serialization.
1180	badSerializeGMs = append(badSerializeGMs, "analytic_antialias_convex")
1181
1182	for _, test := range badSerializeGMs {
1183		skip("serialize-8888", "gm", ALL, test)
1184	}
1185
1186	// We skip these to avoid out-of-memory failures.
1187	if b.matchOs("Win", "Android") {
1188		for _, test := range []string{"verylargebitmap", "verylarge_picture_image"} {
1189			skip("serialize-8888", "gm", ALL, test)
1190		}
1191	}
1192	if b.matchOs("Mac") && b.cpu() {
1193		// skia:6992
1194		skip("pic-8888", "gm", ALL, "encode-platform")
1195		skip("serialize-8888", "gm", ALL, "encode-platform")
1196	}
1197
1198	// skia:14411 -- images are visibly identical, not interested in diagnosing non-determinism here
1199	skip("pic-8888", "gm", ALL, "perlinnoise_layered")
1200	skip("serialize-8888", "gm", ALL, "perlinnoise_layered")
1201	if b.gpu("IntelIrisXe") && !b.extraConfig("Vulkan") {
1202		skip(ALL, "gm", ALL, "perlinnoise_layered") // skia:14411
1203	}
1204
1205	if b.gpu("IntelIrisXe") && b.matchOs("Win") && b.extraConfig("Vulkan") {
1206		skip(ALL, "tests", ALL, "VkYCbcrSampler_DrawImageWithYcbcrSampler") // skia:14628
1207	}
1208
1209	// skia:4769
1210	skip("pic-8888", "gm", ALL, "drawfilter")
1211
1212	// skia:4703
1213	for _, test := range []string{"image-cacherator-from-picture",
1214		"image-cacherator-from-raster",
1215		"image-cacherator-from-ctable"} {
1216		skip("pic-8888", "gm", ALL, test)
1217		skip("serialize-8888", "gm", ALL, test)
1218	}
1219
1220	// GM that requires raster-backed canvas
1221	for _, test := range []string{"complexclip4_bw", "complexclip4_aa", "p3",
1222		"async_rescale_and_read_text_up_large",
1223		"async_rescale_and_read_text_up",
1224		"async_rescale_and_read_text_down",
1225		"async_rescale_and_read_dog_up",
1226		"async_rescale_and_read_dog_down",
1227		"async_rescale_and_read_rose",
1228		"async_rescale_and_read_no_bleed",
1229		"async_rescale_and_read_alpha_type",
1230		"blurrect_compare", // GM requires canvas->makeSurface() to return a valid surface.
1231		"rrect_blurs"} {
1232		skip("pic-8888", "gm", ALL, test)
1233		skip("serialize-8888", "gm", ALL, test)
1234	}
1235
1236	// Extensions for RAW images
1237	r := []string{
1238		"arw", "cr2", "dng", "nef", "nrw", "orf", "raf", "rw2", "pef", "srw",
1239		"ARW", "CR2", "DNG", "NEF", "NRW", "ORF", "RAF", "RW2", "PEF", "SRW",
1240	}
1241
1242	// skbug.com/4888
1243	// Skip RAW images (and a few large PNGs) on GPU tasks
1244	// until we can resolve failures.
1245	if b.gpu() {
1246		skip(ALL, "image", ALL, "interlaced1.png")
1247		skip(ALL, "image", ALL, "interlaced2.png")
1248		skip(ALL, "image", ALL, "interlaced3.png")
1249		for _, rawExt := range r {
1250			skip(ALL, "image", ALL, "."+rawExt)
1251		}
1252	}
1253
1254	if b.model("Nexus5", "Nexus5x", "JioNext") && b.gpu() {
1255		// skia:5876
1256		skip(ALL, "gm", ALL, "encode-platform")
1257	}
1258
1259	if b.model("AndroidOne") && b.gpu() { // skia:4697, skia:4704, skia:4694, skia:4705, skia:11133
1260		skip(ALL, "gm", ALL, "bigblurs")
1261		skip(ALL, "gm", ALL, "strict_constraint_no_red_allowed")
1262		skip(ALL, "gm", ALL, "fast_constraint_red_is_allowed")
1263		skip(ALL, "gm", ALL, "dropshadowimagefilter")
1264		skip(ALL, "gm", ALL, "filterfastbounds")
1265		skip(glPrefix, "gm", ALL, "imageblurtiled")
1266		skip(ALL, "gm", ALL, "imagefiltersclipped")
1267		skip(ALL, "gm", ALL, "imagefiltersscaled")
1268		skip(ALL, "gm", ALL, "imageresizetiled")
1269		skip(ALL, "gm", ALL, "matrixconvolution")
1270		skip(ALL, "gm", ALL, "strokedlines")
1271		skip(ALL, "gm", ALL, "runtime_intrinsics_matrix")
1272		if sampleCount > 0 {
1273			glMsaaConfig := fmt.Sprintf("%smsaa%d", glPrefix, sampleCount)
1274			skip(glMsaaConfig, "gm", ALL, "imageblurtiled")
1275			skip(glMsaaConfig, "gm", ALL, "imagefiltersbase")
1276		}
1277	}
1278
1279	// b/296440036
1280	// disable broken tests on Adreno 5/6xx Vulkan or API30
1281	if b.matchGpu("Adreno[56]") && (b.extraConfig("Vulkan") || b.extraConfig("API30")) {
1282		skip(ALL, "tests", ALL, "ImageAsyncReadPixels_Renderable_BottomLeft")
1283		skip(ALL, "tests", ALL, "ImageAsyncReadPixels_Renderable_TopLeft")
1284		skip(ALL, "tests", ALL, "ImageAsyncReadPixels_NonRenderable_BottomLeft")
1285		skip(ALL, "tests", ALL, "ImageAsyncReadPixels_NonRenderable_TopLeft")
1286		skip(ALL, "tests", ALL, "SurfaceAsyncReadPixels")
1287	}
1288
1289	if b.matchGpu("Adreno[56]") && b.extraConfig("Vulkan") {
1290		skip(ALL, "gm", ALL, "mesh_with_image")
1291		skip(ALL, "gm", ALL, "mesh_with_paint_color")
1292		skip(ALL, "gm", ALL, "mesh_with_paint_image")
1293	}
1294
1295	if b.matchGpu("Mali400") {
1296		skip(ALL, "tests", ALL, "BlendRequiringDstReadWithLargeCoordinates")
1297		skip(ALL, "tests", ALL, "SkSLCross") // despite the name, it's not in SkSLTest.cpp
1298	}
1299
1300	if b.matchOs("Mac") && (b.gpu("IntelIrisPlus") || b.gpu("IntelHD6000")) &&
1301		b.extraConfig("Metal") {
1302		// TODO(skia:296960708): The IntelIrisPlus+Metal config hangs on this test, but passes
1303		// SurfaceContextWritePixelsMipped so let that one keep running.
1304		skip(ALL, "tests", ALL, "SurfaceContextWritePixels")
1305		skip(ALL, "tests", ALL, "SurfaceContextWritePixelsMipped")
1306		skip(ALL, "tests", ALL, "ImageAsyncReadPixels")
1307		skip(ALL, "tests", ALL, "SurfaceAsyncReadPixels")
1308	}
1309
1310	if b.extraConfig("ANGLE") && b.matchOs("Win") && b.matchGpu("IntelIris(540|655|Xe)") {
1311		skip(ALL, "tests", ALL, "ImageFilterCropRect_Gpu") // b/294080402
1312	}
1313
1314	if b.gpu("RTX3060") && b.extraConfig("Vulkan") && b.matchOs("Win") {
1315		skip(ALL, "gm", ALL, "blurcircles2") // skia:13342
1316	}
1317
1318	if b.gpu("QuadroP400") && b.matchOs("Win10") && b.matchModel("Golo") {
1319		// Times out with driver 30.0.15.1179
1320		skip("vkmsaa4", "gm", ALL, "shadow_utils")
1321	}
1322
1323	if b.gpu("RadeonR9M470X") && b.extraConfig("ANGLE") {
1324		// skbug:14293 - ANGLE D3D9 ES2 has flaky texture sampling that leads to fuzzy diff errors
1325		skip(ALL, "tests", ALL, "FilterResult")
1326		// skbug:13815 - Flaky failures on ANGLE D3D9 ES2
1327		skip(ALL, "tests", ALL, "SkRuntimeEffectSimple_Ganesh")
1328		skip(ALL, "tests", ALL, "TestSweepGradientZeroXGanesh")
1329	}
1330
1331	if b.extraConfig("Vulkan") && b.gpu("RadeonVega6") {
1332		skip(ALL, "gm", ALL, "ycbcrimage")                                 // skia:13265
1333		skip(ALL, "test", ALL, "VkYCbcrSampler_DrawImageWithYcbcrSampler") // skia:13265
1334	}
1335
1336	match := []string{}
1337
1338	if b.extraConfig("Graphite") {
1339		// Graphite doesn't do auto-image-tiling so these GMs should remain disabled
1340		match = append(match, "~^verylarge_picture_image$")
1341		match = append(match, "~^verylargebitmap$")
1342		match = append(match, "~^path_huge_aa$")
1343		match = append(match, "~^fast_constraint_red_is_allowed$")
1344		match = append(match, "~^strict_constraint_batch_no_red_allowed$")
1345		match = append(match, "~^strict_constraint_no_red_allowed$")
1346	}
1347
1348	if b.extraConfig("Valgrind") { // skia:3021
1349		match = append(match, "~Threaded")
1350	}
1351
1352	if b.extraConfig("Valgrind") && b.extraConfig("PreAbandonGpuContext") {
1353		// skia:6575
1354		match = append(match, "~multipicturedraw_")
1355	}
1356
1357	if b.model("AndroidOne") {
1358		match = append(match, "~WritePixels")                             // skia:4711
1359		match = append(match, "~PremulAlphaRoundTrip_Gpu")                // skia:7501
1360		match = append(match, "~ReimportImageTextureWithMipLevels")       // skia:8090
1361		match = append(match, "~MorphologyFilterRadiusWithMirrorCTM_Gpu") // skia:10383
1362	}
1363
1364	if b.gpu("IntelIrisXe") {
1365		match = append(match, "~ReimportImageTextureWithMipLevels")
1366	}
1367
1368	if b.extraConfig("MSAN") {
1369		match = append(match, "~Once", "~Shared") // Not sure what's up with these tests.
1370	}
1371
1372	// By default, we test with GPU threading enabled, unless specifically
1373	// disabled.
1374	if b.extraConfig("NoGPUThreads") {
1375		args = append(args, "--gpuThreads", "0")
1376	}
1377
1378	if b.extraConfig("Vulkan") && b.gpu("Adreno530") {
1379		// skia:5777
1380		match = append(match, "~CopySurface")
1381	}
1382
1383	// Pixel4XL on the tree is still on Android 10 (Q), and the vulkan drivers
1384	// crash during this GM. It works correctly on newer versions of Android.
1385	// The Pixel3a is also failing on this GM with an invalid return value from
1386	// vkCreateGraphicPipelines.
1387	if b.extraConfig("Vulkan") && (b.model("Pixel4XL") || b.model("Pixel3a")) {
1388		skip("vk", "gm", ALL, "custommesh_cs_uniforms")
1389	}
1390
1391	if b.extraConfig("Vulkan") && b.matchGpu("Adreno") {
1392		// skia:7663
1393		match = append(match, "~WritePixelsNonTextureMSAA_Gpu")
1394		match = append(match, "~WritePixelsMSAA_Gpu")
1395	}
1396
1397	if b.extraConfig("Vulkan") && b.isLinux() && b.gpu("IntelIris640") {
1398		match = append(match, "~VkHeapTests") // skia:6245
1399	}
1400
1401	if b.isLinux() && b.gpu("IntelIris640") {
1402		match = append(match, "~Programs") // skia:7849
1403	}
1404
1405	if b.model("TecnoSpark3Pro", "Wembley") {
1406		// skia:9814
1407		match = append(match, "~Programs")
1408		match = append(match, "~ProcessorCloneTest")
1409		match = append(match, "~ProcessorOptimizationValidationTest")
1410	}
1411
1412	if b.gpu("IntelIris640", "IntelHD615", "IntelHDGraphics615") {
1413		match = append(match, "~^SRGBReadWritePixels$") // skia:9225
1414	}
1415
1416	if b.extraConfig("Vulkan") && b.isLinux() && b.gpu("IntelHD405") {
1417		// skia:7322
1418		skip("vk", "gm", ALL, "skbug_257")
1419		skip("vk", "gm", ALL, "filltypespersp")
1420		match = append(match, "~^ClearOp$")
1421		match = append(match, "~^CopySurface$")
1422		match = append(match, "~^ImageNewShader_GPU$")
1423		match = append(match, "~^InitialTextureClear$")
1424		match = append(match, "~^PinnedImageTest$")
1425		match = append(match, "~^ReadPixels_Gpu$")
1426		match = append(match, "~^ReadPixels_Texture$")
1427		match = append(match, "~^SRGBReadWritePixels$")
1428		match = append(match, "~^VkUploadPixelsTests$")
1429		match = append(match, "~^WritePixelsNonTexture_Gpu$")
1430		match = append(match, "~^WritePixelsNonTextureMSAA_Gpu$")
1431		match = append(match, "~^WritePixels_Gpu$")
1432		match = append(match, "~^WritePixelsMSAA_Gpu$")
1433	}
1434
1435	if b.extraConfig("Metal") && !b.extraConfig("Graphite") && b.gpu("RadeonHD8870M") && b.matchOs("Mac") {
1436		// skia:9255
1437		match = append(match, "~WritePixelsNonTextureMSAA_Gpu")
1438		// skbug.com/11366
1439		match = append(match, "~SurfacePartialDraw_Gpu")
1440	}
1441
1442	if b.extraConfig("Metal") && !b.extraConfig("Graphite") && b.gpu("PowerVRGX6450") && b.matchOs("iOS") {
1443		// skbug.com/11885
1444		match = append(match, "~flight_animated_image")
1445	}
1446
1447	if b.extraConfig("ANGLE") {
1448		// skia:7835
1449		match = append(match, "~BlurMaskBiggerThanDest")
1450	}
1451
1452	if b.gpu("IntelIris6100") && b.extraConfig("ANGLE") && !b.debug() {
1453		// skia:7376
1454		match = append(match, "~^ProcessorOptimizationValidationTest$")
1455	}
1456
1457	if b.gpu("IntelIris6100", "IntelHD4400") && b.extraConfig("ANGLE") {
1458		// skia:6857
1459		skip("angle_d3d9_es2", "gm", ALL, "lighting")
1460	}
1461
1462	if b.gpu("PowerVRGX6250") {
1463		match = append(match, "~gradients_view_perspective_nodither") //skia:6972
1464	}
1465
1466	if b.arch("arm") && b.extraConfig("ASAN") {
1467		// TODO: can we run with env allocator_may_return_null=1 instead?
1468		match = append(match, "~BadImage")
1469	}
1470
1471	if b.arch("arm64") && b.extraConfig("ASAN") {
1472		// skbug.com/13155 the use of longjmp may cause ASAN stack check issues.
1473		skip(ALL, "test", ALL, "SkPDF_JpegIdentification")
1474	}
1475
1476	if b.extraConfig("HWASAN") {
1477		// HWASAN adds tag bytes to pointers. That's incompatible with this test -- it compares
1478		// pointers from unrelated stack frames to check that RP isn't growing the stack.
1479		skip(ALL, "test", ALL, "SkRasterPipeline_stack_rewind")
1480	}
1481
1482	if b.matchOs("Mac") && b.gpu("IntelHD6000") {
1483		// skia:7574
1484		match = append(match, "~^ProcessorCloneTest$")
1485		match = append(match, "~^GrMeshTest$")
1486	}
1487
1488	if b.matchOs("Mac") && b.gpu("IntelHD615") {
1489		// skia:7603
1490		match = append(match, "~^GrMeshTest$")
1491	}
1492
1493	if b.matchOs("Mac") && b.gpu("IntelIrisPlus") {
1494		// skia:7603
1495		match = append(match, "~^GrMeshTest$")
1496	}
1497
1498	if b.matchOs("Mac") && b.gpu("IntelUHDGraphics630") {
1499		// skia:7603
1500		match = append(match, "~^GrMeshTest$")
1501	}
1502
1503	if b.extraConfig("Vulkan") && b.model("GalaxyS20") {
1504		// skia:10247
1505		match = append(match, "~VkPrepareForExternalIOQueueTransitionTest")
1506	}
1507	if b.matchExtraConfig("Graphite") {
1508		// skia:12813
1509		match = append(match, "~async_rescale_and_read")
1510	}
1511
1512	if b.matchExtraConfig("ColorSpaces") {
1513		// Here we reset the 'match' and 'skipped' strings bc the ColorSpaces job only runs
1514		// a very specific subset of the GMs.
1515		skipped = []string{}
1516		match = []string{}
1517		match = append(match, "async_rescale_and_read_dog_up")
1518		match = append(match, "bug6783")
1519		match = append(match, "colorspace")
1520		match = append(match, "colorspace2")
1521		match = append(match, "coloremoji")
1522		match = append(match, "composeCF")
1523		match = append(match, "crbug_224618")
1524		match = append(match, "drawlines_with_local_matrix")
1525		match = append(match, "gradients_interesting")
1526		match = append(match, "manypathatlases_2048")
1527		match = append(match, "custommesh_cs_uniforms")
1528		match = append(match, "paint_alpha_normals_rt")
1529		match = append(match, "runtimefunctions")
1530		match = append(match, "savelayer_f16")
1531		match = append(match, "spiral_rt")
1532		match = append(match, "srgb_colorfilter")
1533		match = append(match, "strokedlines")
1534		match = append(match, "sweep_tiling")
1535	}
1536
1537	if b.matchExtraConfig("RustPNG") {
1538		// TODO(b/356875275) many PNG decoding tests still fail (e.g. those with SkAndroidCodec
1539		// or some from DM's image source). For now, just opt-in the tests we know pass and
1540		// eventually remove this special handling to run all image tests.
1541		skipped = []string{}
1542		match = []string{
1543			"RustPngCodec",
1544			"RustEncodePng",
1545		}
1546	}
1547
1548	if len(skipped) > 0 {
1549		args = append(args, "--skip")
1550		args = append(args, skipped...)
1551	}
1552
1553	if len(match) > 0 {
1554		args = append(args, "--match")
1555		args = append(args, match...)
1556	}
1557
1558	// These devices run out of memory running RAW codec tests. Do not run them in
1559	// parallel
1560	// TODO(borenet): Previously this was `'Nexus5' in bot or 'Nexus9' in bot`
1561	// which also matched 'Nexus5x'. I added That here to maintain the
1562	// existing behavior, but we should verify that it's needed.
1563	if b.model("Nexus5", "Nexus5x", "Nexus9", "JioNext") {
1564		args = append(args, "--noRAW_threading")
1565	}
1566
1567	if b.extraConfig("NativeFonts") {
1568		args = append(args, "--nativeFonts")
1569		if !b.matchOs("Android") {
1570			args = append(args, "--paragraph_fonts", "extra_fonts")
1571			args = append(args, "--norun_paragraph_tests_needing_system_fonts")
1572		}
1573	} else {
1574		args = append(args, "--nonativeFonts")
1575	}
1576	if b.extraConfig("GDI") {
1577		args = append(args, "--gdi")
1578	}
1579	if b.extraConfig("Fontations") {
1580		args = append(args, "--fontations")
1581	}
1582	if b.extraConfig("AndroidNDKFonts") {
1583		args = append(args, "--androidndkfonts")
1584	}
1585
1586	// Let's make all tasks produce verbose output by default.
1587	args = append(args, "--verbose")
1588
1589	// See skia:2789.
1590	if b.extraConfig("AbandonGpuContext") {
1591		args = append(args, "--abandonGpuContext")
1592	}
1593	if b.extraConfig("PreAbandonGpuContext") {
1594		args = append(args, "--preAbandonGpuContext")
1595	}
1596	if b.extraConfig("ReleaseAndAbandonGpuContext") {
1597		args = append(args, "--releaseAndAbandonGpuContext")
1598	}
1599
1600	if b.extraConfig("NeverYield") {
1601		args = append(args, "--neverYieldToWebGPU")
1602	}
1603
1604	if b.extraConfig("FailFlushTimeCallbacks") {
1605		args = append(args, "--failFlushTimeCallbacks")
1606	}
1607
1608	// Finalize the DM flags and properties.
1609	b.recipeProp("dm_flags", marshalJson(args))
1610	b.recipeProp("dm_properties", marshalJson(properties))
1611
1612	// Add properties indicating which assets the task should use.
1613	if b.matchExtraConfig("Lottie") {
1614		b.asset("lottie-samples")
1615		b.recipeProp("lotties", "true")
1616	} else if b.matchExtraConfig("OldestSupportedSkpVersion") {
1617		b.recipeProp("skps", "true")
1618	} else {
1619		b.asset("skimage")
1620		b.recipeProp("images", "true")
1621		b.asset("skp")
1622		b.recipeProp("skps", "true")
1623		b.asset("svg")
1624		b.recipeProp("svgs", "true")
1625	}
1626	b.recipeProp("do_upload", fmt.Sprintf("%t", b.doUpload()))
1627	b.recipeProp("resources", "true")
1628}
1629