1*c8dee2aaSAndroid Build Coastguard Worker /*
2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2021 Google LLC
3*c8dee2aaSAndroid Build Coastguard Worker *
4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be
5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file.
6*c8dee2aaSAndroid Build Coastguard Worker */
7*c8dee2aaSAndroid Build Coastguard Worker
8*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkBitmap.h"
9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h"
10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h"
11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkData.h"
12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkImageInfo.h"
13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h"
14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h"
15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRefCnt.h"
16*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkShader.h"
17*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSpan.h"
18*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkString.h"
19*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h"
20*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkTypes.h"
21*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkRuntimeEffect.h"
22*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/GpuTypes.h"
23*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/GrDirectContext.h"
24*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/ganesh/SkSurfaceGanesh.h"
25*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkTArray.h"
26*c8dee2aaSAndroid Build Coastguard Worker #include "include/sksl/SkSLVersion.h"
27*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkArenaAlloc.h"
28*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkEnumBitMask.h"
29*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkNoDestructor.h"
30*c8dee2aaSAndroid Build Coastguard Worker #include "src/base/SkStringView.h"
31*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRasterPipeline.h"
32*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRasterPipelineOpContexts.h"
33*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRasterPipelineOpList.h"
34*c8dee2aaSAndroid Build Coastguard Worker #include "src/core/SkRuntimeEffectPriv.h"
35*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrCaps.h"
36*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrDirectContextPriv.h"
37*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/ganesh/GrShaderCaps.h"
38*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLCompiler.h"
39*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramKind.h"
40*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLProgramSettings.h"
41*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/SkSLUtil.h"
42*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/analysis/SkSLProgramVisitor.h"
43*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/codegen/SkSLRasterPipelineBuilder.h"
44*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/codegen/SkSLRasterPipelineCodeGenerator.h"
45*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLFunctionDeclaration.h"
46*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLModifierFlags.h"
47*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLProgram.h"
48*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLProgramElement.h"
49*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLStatement.h"
50*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLType.h"
51*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLVarDeclarations.h"
52*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/ir/SkSLVariable.h"
53*c8dee2aaSAndroid Build Coastguard Worker #include "src/sksl/tracing/SkSLDebugTracePriv.h"
54*c8dee2aaSAndroid Build Coastguard Worker #include "tests/CtsEnforcement.h"
55*c8dee2aaSAndroid Build Coastguard Worker #include "tests/Test.h"
56*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h"
57*c8dee2aaSAndroid Build Coastguard Worker
58*c8dee2aaSAndroid Build Coastguard Worker #include <algorithm>
59*c8dee2aaSAndroid Build Coastguard Worker #include <cstddef>
60*c8dee2aaSAndroid Build Coastguard Worker #include <cstdint>
61*c8dee2aaSAndroid Build Coastguard Worker #include <memory>
62*c8dee2aaSAndroid Build Coastguard Worker #include <regex>
63*c8dee2aaSAndroid Build Coastguard Worker #include <string>
64*c8dee2aaSAndroid Build Coastguard Worker #include <string_view>
65*c8dee2aaSAndroid Build Coastguard Worker #include <vector>
66*c8dee2aaSAndroid Build Coastguard Worker
67*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
68*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Context.h"
69*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/ContextOptions.h"
70*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Recorder.h"
71*c8dee2aaSAndroid Build Coastguard Worker #include "include/gpu/graphite/Surface.h"
72*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/Caps.h"
73*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/ContextPriv.h"
74*c8dee2aaSAndroid Build Coastguard Worker #include "tools/graphite/GraphiteTestContext.h"
75*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DAWN)
76*c8dee2aaSAndroid Build Coastguard Worker #include "src/gpu/graphite/dawn/DawnCaps.h"
77*c8dee2aaSAndroid Build Coastguard Worker #endif
78*c8dee2aaSAndroid Build Coastguard Worker #endif
79*c8dee2aaSAndroid Build Coastguard Worker
80*c8dee2aaSAndroid Build Coastguard Worker using namespace skia_private;
81*c8dee2aaSAndroid Build Coastguard Worker
82*c8dee2aaSAndroid Build Coastguard Worker namespace SkSL { class Context; }
83*c8dee2aaSAndroid Build Coastguard Worker struct GrContextOptions;
84*c8dee2aaSAndroid Build Coastguard Worker
85*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kWidth = 2;
86*c8dee2aaSAndroid Build Coastguard Worker static constexpr int kHeight = 2;
87*c8dee2aaSAndroid Build Coastguard Worker
88*c8dee2aaSAndroid Build Coastguard Worker enum class SkSLTestFlag : int {
89*c8dee2aaSAndroid Build Coastguard Worker /** `CPU` tests must pass when painted to a CPU-backed surface via SkRuntimeEffect. */
90*c8dee2aaSAndroid Build Coastguard Worker CPU = 1 << 0,
91*c8dee2aaSAndroid Build Coastguard Worker
92*c8dee2aaSAndroid Build Coastguard Worker /**
93*c8dee2aaSAndroid Build Coastguard Worker * `ES3` tests must pass when executed directly on the CPU via the SkRasterPipeline backend.
94*c8dee2aaSAndroid Build Coastguard Worker * They aren't compatible with SkRuntimeEffect, since they use non-ES2 features.
95*c8dee2aaSAndroid Build Coastguard Worker */
96*c8dee2aaSAndroid Build Coastguard Worker ES3 = 1 << 1,
97*c8dee2aaSAndroid Build Coastguard Worker
98*c8dee2aaSAndroid Build Coastguard Worker /** `GPU` tests must pass when painted to a GPU-backed surface via SkRuntimeEffect. */
99*c8dee2aaSAndroid Build Coastguard Worker GPU = 1 << 2,
100*c8dee2aaSAndroid Build Coastguard Worker
101*c8dee2aaSAndroid Build Coastguard Worker /** `GPU_ES3` tests must pass on ES3-compatible GPUs when "enforce ES2 restrictions" is off. */
102*c8dee2aaSAndroid Build Coastguard Worker GPU_ES3 = 1 << 3,
103*c8dee2aaSAndroid Build Coastguard Worker
104*c8dee2aaSAndroid Build Coastguard Worker /**
105*c8dee2aaSAndroid Build Coastguard Worker * `UsesNaN` tests rely on NaN values, so they are only expected to pass on GPUs that generate
106*c8dee2aaSAndroid Build Coastguard Worker * them (which is not a requirement, even with ES3).
107*c8dee2aaSAndroid Build Coastguard Worker */
108*c8dee2aaSAndroid Build Coastguard Worker UsesNaN = 1 << 4,
109*c8dee2aaSAndroid Build Coastguard Worker
110*c8dee2aaSAndroid Build Coastguard Worker /**
111*c8dee2aaSAndroid Build Coastguard Worker * `Priv` tests rely on `AllowPrivateAccess` support in the runtime effect.
112*c8dee2aaSAndroid Build Coastguard Worker */
113*c8dee2aaSAndroid Build Coastguard Worker Priv = 1 << 5,
114*c8dee2aaSAndroid Build Coastguard Worker };
115*c8dee2aaSAndroid Build Coastguard Worker
116*c8dee2aaSAndroid Build Coastguard Worker using SkSLTestFlags = SkEnumBitMask<SkSLTestFlag>;
117*c8dee2aaSAndroid Build Coastguard Worker
is_cpu(SkSLTestFlags flags)118*c8dee2aaSAndroid Build Coastguard Worker static constexpr bool is_cpu(SkSLTestFlags flags) {
119*c8dee2aaSAndroid Build Coastguard Worker return SkToBool(flags & SkSLTestFlag::CPU);
120*c8dee2aaSAndroid Build Coastguard Worker }
121*c8dee2aaSAndroid Build Coastguard Worker
is_gpu(SkSLTestFlags flags)122*c8dee2aaSAndroid Build Coastguard Worker static constexpr bool is_gpu(SkSLTestFlags flags) {
123*c8dee2aaSAndroid Build Coastguard Worker return (flags & SkSLTestFlag::GPU) || (flags & SkSLTestFlag::GPU_ES3);
124*c8dee2aaSAndroid Build Coastguard Worker }
125*c8dee2aaSAndroid Build Coastguard Worker
is_strict_es2(SkSLTestFlags flags)126*c8dee2aaSAndroid Build Coastguard Worker static constexpr bool is_strict_es2(SkSLTestFlags flags) {
127*c8dee2aaSAndroid Build Coastguard Worker return !(flags & SkSLTestFlag::GPU_ES3) && !(flags & SkSLTestFlag::ES3);
128*c8dee2aaSAndroid Build Coastguard Worker }
129*c8dee2aaSAndroid Build Coastguard Worker
130*c8dee2aaSAndroid Build Coastguard Worker struct UniformData {
131*c8dee2aaSAndroid Build Coastguard Worker std::string_view name;
132*c8dee2aaSAndroid Build Coastguard Worker SkSpan<const float> span;
133*c8dee2aaSAndroid Build Coastguard Worker };
134*c8dee2aaSAndroid Build Coastguard Worker
135*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformColorBlack[] = {0.0f, 0.0f, 0.0f, 1.0f};
136*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformColorRed [] = {1.0f, 0.0f, 0.0f, 1.0f};
137*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformColorGreen[] = {0.0f, 1.0f, 0.0f, 1.0f};
138*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformColorBlue [] = {0.0f, 0.0f, 1.0f, 1.0f};
139*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformColorWhite[] = {1.0f, 1.0f, 1.0f, 1.0f};
140*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformTestInputs[] = {-1.25f, 0.0f, 0.75f, 2.25f};
141*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformUnknownInput[] = {1.0f};
142*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformTestMatrix2x2[] = {1.0f, 2.0f,
143*c8dee2aaSAndroid Build Coastguard Worker 3.0f, 4.0f};
144*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformTestMatrix3x3[] = {1.0f, 2.0f, 3.0f,
145*c8dee2aaSAndroid Build Coastguard Worker 4.0f, 5.0f, 6.0f,
146*c8dee2aaSAndroid Build Coastguard Worker 7.0f, 8.0f, 9.0f};
147*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformTestMatrix4x4[] = {1.0f, 2.0f, 3.0f, 4.0f,
148*c8dee2aaSAndroid Build Coastguard Worker 5.0f, 6.0f, 7.0f, 8.0f,
149*c8dee2aaSAndroid Build Coastguard Worker 9.0f, 10.0f, 11.0f, 12.0f,
150*c8dee2aaSAndroid Build Coastguard Worker 13.0f, 14.0f, 15.0f, 16.0f};
151*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformTestArray[] = {1, 2, 3, 4, 5};
152*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kUniformTestArrayNegative[] = {-1, -2, -3, -4, -5};
153*c8dee2aaSAndroid Build Coastguard Worker
154*c8dee2aaSAndroid Build Coastguard Worker static constexpr UniformData kUniformData[] = {
155*c8dee2aaSAndroid Build Coastguard Worker {"colorBlack", kUniformColorBlack},
156*c8dee2aaSAndroid Build Coastguard Worker {"colorRed", kUniformColorRed},
157*c8dee2aaSAndroid Build Coastguard Worker {"colorGreen", kUniformColorGreen},
158*c8dee2aaSAndroid Build Coastguard Worker {"colorBlue", kUniformColorBlue},
159*c8dee2aaSAndroid Build Coastguard Worker {"colorWhite", kUniformColorWhite},
160*c8dee2aaSAndroid Build Coastguard Worker {"testInputs", kUniformTestInputs},
161*c8dee2aaSAndroid Build Coastguard Worker {"unknownInput", kUniformUnknownInput},
162*c8dee2aaSAndroid Build Coastguard Worker {"testMatrix2x2", kUniformTestMatrix2x2},
163*c8dee2aaSAndroid Build Coastguard Worker {"testMatrix3x3", kUniformTestMatrix3x3},
164*c8dee2aaSAndroid Build Coastguard Worker {"testMatrix4x4", kUniformTestMatrix4x4},
165*c8dee2aaSAndroid Build Coastguard Worker {"testArray", kUniformTestArray},
166*c8dee2aaSAndroid Build Coastguard Worker {"testArrayNegative", kUniformTestArrayNegative},
167*c8dee2aaSAndroid Build Coastguard Worker };
168*c8dee2aaSAndroid Build Coastguard Worker
bitmap_from_shader(skiatest::Reporter * r,SkSurface * surface,sk_sp<SkRuntimeEffect> effect)169*c8dee2aaSAndroid Build Coastguard Worker static SkBitmap bitmap_from_shader(skiatest::Reporter* r,
170*c8dee2aaSAndroid Build Coastguard Worker SkSurface* surface,
171*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkRuntimeEffect> effect) {
172*c8dee2aaSAndroid Build Coastguard Worker SkRuntimeShaderBuilder builder(effect);
173*c8dee2aaSAndroid Build Coastguard Worker for (const UniformData& data : kUniformData) {
174*c8dee2aaSAndroid Build Coastguard Worker SkRuntimeShaderBuilder::BuilderUniform uniform = builder.uniform(data.name);
175*c8dee2aaSAndroid Build Coastguard Worker if (uniform.fVar) {
176*c8dee2aaSAndroid Build Coastguard Worker uniform.set(data.span.data(), data.span.size());
177*c8dee2aaSAndroid Build Coastguard Worker }
178*c8dee2aaSAndroid Build Coastguard Worker }
179*c8dee2aaSAndroid Build Coastguard Worker
180*c8dee2aaSAndroid Build Coastguard Worker if (SkRuntimeShaderBuilder::BuilderChild green = builder.child("shaderGreen"); green.fChild) {
181*c8dee2aaSAndroid Build Coastguard Worker green = SkShaders::Color(SK_ColorGREEN);
182*c8dee2aaSAndroid Build Coastguard Worker }
183*c8dee2aaSAndroid Build Coastguard Worker
184*c8dee2aaSAndroid Build Coastguard Worker if (SkRuntimeShaderBuilder::BuilderChild red = builder.child("shaderRed"); red.fChild) {
185*c8dee2aaSAndroid Build Coastguard Worker red = SkShaders::Color(SK_ColorRED);
186*c8dee2aaSAndroid Build Coastguard Worker }
187*c8dee2aaSAndroid Build Coastguard Worker
188*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkShader> shader = builder.makeShader();
189*c8dee2aaSAndroid Build Coastguard Worker if (!shader) {
190*c8dee2aaSAndroid Build Coastguard Worker return SkBitmap{};
191*c8dee2aaSAndroid Build Coastguard Worker }
192*c8dee2aaSAndroid Build Coastguard Worker
193*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->clear(SK_ColorBLACK);
194*c8dee2aaSAndroid Build Coastguard Worker
195*c8dee2aaSAndroid Build Coastguard Worker SkPaint paintShader;
196*c8dee2aaSAndroid Build Coastguard Worker paintShader.setShader(shader);
197*c8dee2aaSAndroid Build Coastguard Worker surface->getCanvas()->drawRect(SkRect::MakeWH(kWidth, kHeight), paintShader);
198*c8dee2aaSAndroid Build Coastguard Worker
199*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmap;
200*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, bitmap.tryAllocPixels(surface->imageInfo()));
201*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, surface->readPixels(bitmap, /*srcX=*/0, /*srcY=*/0));
202*c8dee2aaSAndroid Build Coastguard Worker return bitmap;
203*c8dee2aaSAndroid Build Coastguard Worker }
204*c8dee2aaSAndroid Build Coastguard Worker
gpu_generates_nan(skiatest::Reporter * r,GrDirectContext * ctx)205*c8dee2aaSAndroid Build Coastguard Worker static bool gpu_generates_nan(skiatest::Reporter* r, GrDirectContext* ctx) {
206*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS)
207*c8dee2aaSAndroid Build Coastguard Worker // The Metal shader compiler (which is also used under-the-hood for some GL/GLES contexts on
208*c8dee2aaSAndroid Build Coastguard Worker // these platforms) enables fast-math by default. That prevents NaN-based tests from passing:
209*c8dee2aaSAndroid Build Coastguard Worker // https://developer.apple.com/documentation/metal/mtlcompileoptions/1515914-fastmathenabled
210*c8dee2aaSAndroid Build Coastguard Worker return false;
211*c8dee2aaSAndroid Build Coastguard Worker #else
212*c8dee2aaSAndroid Build Coastguard Worker // If we don't have infinity support, we definitely won't generate NaNs
213*c8dee2aaSAndroid Build Coastguard Worker if (!ctx->priv().caps()->shaderCaps()->fInfinitySupport) {
214*c8dee2aaSAndroid Build Coastguard Worker return false;
215*c8dee2aaSAndroid Build Coastguard Worker }
216*c8dee2aaSAndroid Build Coastguard Worker
217*c8dee2aaSAndroid Build Coastguard Worker auto effect = SkRuntimeEffect::MakeForShader(SkString(R"(
218*c8dee2aaSAndroid Build Coastguard Worker #version 300
219*c8dee2aaSAndroid Build Coastguard Worker uniform half4 colorGreen, colorRed;
220*c8dee2aaSAndroid Build Coastguard Worker
221*c8dee2aaSAndroid Build Coastguard Worker half4 main(float2 xy) {
222*c8dee2aaSAndroid Build Coastguard Worker return isnan(colorGreen.r / colorGreen.b) ? colorGreen : colorRed;
223*c8dee2aaSAndroid Build Coastguard Worker }
224*c8dee2aaSAndroid Build Coastguard Worker )")).effect;
225*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, effect);
226*c8dee2aaSAndroid Build Coastguard Worker
227*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight);
228*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface(SkSurfaces::RenderTarget(ctx, skgpu::Budgeted::kNo, info));
229*c8dee2aaSAndroid Build Coastguard Worker
230*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmap = bitmap_from_shader(r, surface.get(), effect);
231*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, !bitmap.empty());
232*c8dee2aaSAndroid Build Coastguard Worker
233*c8dee2aaSAndroid Build Coastguard Worker SkColor color = bitmap.getColor(0, 0);
234*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(r, color == SK_ColorGREEN || color == SK_ColorRED);
235*c8dee2aaSAndroid Build Coastguard Worker return color == SK_ColorGREEN;
236*c8dee2aaSAndroid Build Coastguard Worker #endif
237*c8dee2aaSAndroid Build Coastguard Worker }
238*c8dee2aaSAndroid Build Coastguard Worker
load_source(skiatest::Reporter * r,const char * testFile,const char * permutationSuffix)239*c8dee2aaSAndroid Build Coastguard Worker static SkString load_source(skiatest::Reporter* r,
240*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
241*c8dee2aaSAndroid Build Coastguard Worker const char* permutationSuffix) {
242*c8dee2aaSAndroid Build Coastguard Worker SkString resourcePath = SkStringPrintf("sksl/%s", testFile);
243*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkData> shaderData = GetResourceAsData(resourcePath.c_str());
244*c8dee2aaSAndroid Build Coastguard Worker if (!shaderData) {
245*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s%s: Unable to load file", testFile, permutationSuffix);
246*c8dee2aaSAndroid Build Coastguard Worker return SkString("");
247*c8dee2aaSAndroid Build Coastguard Worker }
248*c8dee2aaSAndroid Build Coastguard Worker return SkString{reinterpret_cast<const char*>(shaderData->bytes()), shaderData->size()};
249*c8dee2aaSAndroid Build Coastguard Worker }
250*c8dee2aaSAndroid Build Coastguard Worker
failure_is_expected(std::string_view deviceName,std::string_view backendAPI,std::string_view name,skiatest::TestType testType)251*c8dee2aaSAndroid Build Coastguard Worker static bool failure_is_expected(std::string_view deviceName, // "Geforce RTX4090"
252*c8dee2aaSAndroid Build Coastguard Worker std::string_view backendAPI, // "OpenGL"
253*c8dee2aaSAndroid Build Coastguard Worker std::string_view name, // "MatrixToVectorCast"
254*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType testType) { // skiatest::TestType::kGraphite
255*c8dee2aaSAndroid Build Coastguard Worker enum TestTypeMatcher { CPU, Ganesh, Graphite, GPU /* either Ganesh or Graphite */ };
256*c8dee2aaSAndroid Build Coastguard Worker
257*c8dee2aaSAndroid Build Coastguard Worker struct TestDisable {
258*c8dee2aaSAndroid Build Coastguard Worker std::optional<std::regex> deviceName;
259*c8dee2aaSAndroid Build Coastguard Worker std::optional<std::string_view> backendAPI;
260*c8dee2aaSAndroid Build Coastguard Worker std::optional<TestTypeMatcher> testTypeMatcher;
261*c8dee2aaSAndroid Build Coastguard Worker std::optional<bool> platform;
262*c8dee2aaSAndroid Build Coastguard Worker };
263*c8dee2aaSAndroid Build Coastguard Worker
264*c8dee2aaSAndroid Build Coastguard Worker using TestDisableMap = THashMap<std::string_view, std::vector<TestDisable>>;
265*c8dee2aaSAndroid Build Coastguard Worker
266*c8dee2aaSAndroid Build Coastguard Worker // TODO(b/40044139): migrate test-disable list from dm_flags into this map
267*c8dee2aaSAndroid Build Coastguard Worker static SkNoDestructor<TestDisableMap> testDisableMap{[] {
268*c8dee2aaSAndroid Build Coastguard Worker #define ADRENO "Adreno \\(TM\\) "
269*c8dee2aaSAndroid Build Coastguard Worker #define NVIDIA "(Tegra|Quadro|RTX|GTX) "
270*c8dee2aaSAndroid Build Coastguard Worker
271*c8dee2aaSAndroid Build Coastguard Worker TestDisableMap disables;
272*c8dee2aaSAndroid Build Coastguard Worker constexpr std::nullopt_t _ = std::nullopt;
273*c8dee2aaSAndroid Build Coastguard Worker using regex = std::regex;
274*c8dee2aaSAndroid Build Coastguard Worker
275*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_UNIX)
276*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kLinux = true;
277*c8dee2aaSAndroid Build Coastguard Worker #else
278*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kLinux = false;
279*c8dee2aaSAndroid Build Coastguard Worker #endif
280*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_MAC)
281*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kMac = true;
282*c8dee2aaSAndroid Build Coastguard Worker #else
283*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kMac = false;
284*c8dee2aaSAndroid Build Coastguard Worker #endif
285*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_IOS)
286*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kiOS = true;
287*c8dee2aaSAndroid Build Coastguard Worker #else
288*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kiOS = false;
289*c8dee2aaSAndroid Build Coastguard Worker #endif
290*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_WIN)
291*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kWindows = true;
292*c8dee2aaSAndroid Build Coastguard Worker #else
293*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kWindows = false;
294*c8dee2aaSAndroid Build Coastguard Worker #endif
295*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_BUILD_FOR_ANDROID)
296*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kAndroid = true;
297*c8dee2aaSAndroid Build Coastguard Worker #else
298*c8dee2aaSAndroid Build Coastguard Worker constexpr bool kAndroid = false;
299*c8dee2aaSAndroid Build Coastguard Worker #endif
300*c8dee2aaSAndroid Build Coastguard Worker
301*c8dee2aaSAndroid Build Coastguard Worker // - Apple --------------------------------------------------------------------------------
302*c8dee2aaSAndroid Build Coastguard Worker // MacOS/iOS do not handle short-circuit evaluation properly in OpenGL (chromium:307751)
303*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"LogicalAndShortCircuit",
304*c8dee2aaSAndroid Build Coastguard Worker "LogicalOrShortCircuit"}) {
305*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({_, "OpenGL", GPU, kMac || kiOS});
306*c8dee2aaSAndroid Build Coastguard Worker }
307*c8dee2aaSAndroid Build Coastguard Worker
308*c8dee2aaSAndroid Build Coastguard Worker // ANGLE has a handful of Mac-specific bugs.
309*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"MatrixScalarNoOpFolding", // anglebug.com/7525
310*c8dee2aaSAndroid Build Coastguard Worker "MatrixScalarMath", // anglebug.com/7525
311*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexStore", // Apple bug FB12055941
312*c8dee2aaSAndroid Build Coastguard Worker "OutParamsAreDistinctFromGlobal", // anglebug.com/7145
313*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicMixFloatES3"}) { // anglebug.com/7245
314*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({_, "ANGLE", GPU, kMac});
315*c8dee2aaSAndroid Build Coastguard Worker }
316*c8dee2aaSAndroid Build Coastguard Worker
317*c8dee2aaSAndroid Build Coastguard Worker // Switch fallthrough has some issues on iOS.
318*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"SwitchWithFallthrough",
319*c8dee2aaSAndroid Build Coastguard Worker "SwitchWithFallthroughGroups"}) {
320*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({_, "OpenGL", GPU, kiOS});
321*c8dee2aaSAndroid Build Coastguard Worker }
322*c8dee2aaSAndroid Build Coastguard Worker
323*c8dee2aaSAndroid Build Coastguard Worker // - ARM ----------------------------------------------------------------------------------
324*c8dee2aaSAndroid Build Coastguard Worker // Mali 400 is a very old driver its share of quirks, particularly in relation to matrices.
325*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"Matrices", // b/40043539
326*c8dee2aaSAndroid Build Coastguard Worker "MatrixNoOpFolding",
327*c8dee2aaSAndroid Build Coastguard Worker "MatrixScalarMath", // b/40043764
328*c8dee2aaSAndroid Build Coastguard Worker "MatrixSwizzleStore",
329*c8dee2aaSAndroid Build Coastguard Worker "MatrixScalarNoOpFolding", // b/40044644
330*c8dee2aaSAndroid Build Coastguard Worker "UnaryPositiveNegative",
331*c8dee2aaSAndroid Build Coastguard Worker "Cross"}) {
332*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Mali-400"), _, GPU, _});
333*c8dee2aaSAndroid Build Coastguard Worker }
334*c8dee2aaSAndroid Build Coastguard Worker
335*c8dee2aaSAndroid Build Coastguard Worker // - Nvidia -------------------------------------------------------------------------------
336*c8dee2aaSAndroid Build Coastguard Worker // Tegra3 has several issues, but the inability to break from a for loop is a common theme.
337*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"Switch", // b/40043561
338*c8dee2aaSAndroid Build Coastguard Worker "SwitchDefaultOnly", // " "
339*c8dee2aaSAndroid Build Coastguard Worker "SwitchWithFallthrough", // " "
340*c8dee2aaSAndroid Build Coastguard Worker "SwitchWithFallthroughAndVarDecls", // " "
341*c8dee2aaSAndroid Build Coastguard Worker "SwitchWithFallthroughGroups", // " "
342*c8dee2aaSAndroid Build Coastguard Worker "SwitchWithLoops", // " "
343*c8dee2aaSAndroid Build Coastguard Worker "SwitchCaseFolding", // " "
344*c8dee2aaSAndroid Build Coastguard Worker "LoopFloat", // " "
345*c8dee2aaSAndroid Build Coastguard Worker "LoopInt", // " "
346*c8dee2aaSAndroid Build Coastguard Worker "MatrixScalarNoOpFolding", // b/40044644
347*c8dee2aaSAndroid Build Coastguard Worker "MatrixScalarMath", // b/40043764
348*c8dee2aaSAndroid Build Coastguard Worker "MatrixFoldingES2", // b/40043017
349*c8dee2aaSAndroid Build Coastguard Worker "MatrixEquality", // b/40043017
350*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicFract",
351*c8dee2aaSAndroid Build Coastguard Worker "ModifiedStructParametersCannotBeInlined"}) {
352*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Tegra 3"), _, GPU, _});
353*c8dee2aaSAndroid Build Coastguard Worker }
354*c8dee2aaSAndroid Build Coastguard Worker
355*c8dee2aaSAndroid Build Coastguard Worker // Various Nvidia GPUs generate errors when assembling weird matrices, and erroneously
356*c8dee2aaSAndroid Build Coastguard Worker // constant-fold expressions with side-effects in constructors when compiling GLSL.
357*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"MatrixConstructorsES2", // b/40043524
358*c8dee2aaSAndroid Build Coastguard Worker "MatrixConstructorsES3", // b/40043524
359*c8dee2aaSAndroid Build Coastguard Worker "MatrixScalarNoOpFolding", // b/40044644
360*c8dee2aaSAndroid Build Coastguard Worker "PreserveSideEffects", // b/40044140
361*c8dee2aaSAndroid Build Coastguard Worker "StructFieldNoFolding"}) { // b/40044479
362*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(NVIDIA), "OpenGL", _, _});
363*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(NVIDIA), "ANGLE GL", _, _});
364*c8dee2aaSAndroid Build Coastguard Worker }
365*c8dee2aaSAndroid Build Coastguard Worker
366*c8dee2aaSAndroid Build Coastguard Worker disables["IntrinsicMixFloatES3"].push_back({regex("RTX "), "Vulkan", _, kWindows});
367*c8dee2aaSAndroid Build Coastguard Worker
368*c8dee2aaSAndroid Build Coastguard Worker // The Golo features P400s with older and buggier drivers than usual.
369*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"PreserveSideEffects", // b/40044140
370*c8dee2aaSAndroid Build Coastguard Worker "CommaSideEffects"}) {
371*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Quadro P400"), _, _, kLinux});
372*c8dee2aaSAndroid Build Coastguard Worker }
373*c8dee2aaSAndroid Build Coastguard Worker
374*c8dee2aaSAndroid Build Coastguard Worker // b/318725123
375*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"UniformArray",
376*c8dee2aaSAndroid Build Coastguard Worker "TemporaryIndexLookup",
377*c8dee2aaSAndroid Build Coastguard Worker "MatrixIndexLookup"}) {
378*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Quadro P400"), "Dawn Vulkan", Graphite, kWindows});
379*c8dee2aaSAndroid Build Coastguard Worker }
380*c8dee2aaSAndroid Build Coastguard Worker
381*c8dee2aaSAndroid Build Coastguard Worker // - PowerVR ------------------------------------------------------------------------------
382*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"OutParamsAreDistinct", // b/40044222
383*c8dee2aaSAndroid Build Coastguard Worker "OutParamsAreDistinctFromGlobal"}) {
384*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("PowerVR Rogue GE8300"), _, GPU, _});
385*c8dee2aaSAndroid Build Coastguard Worker }
386*c8dee2aaSAndroid Build Coastguard Worker
387*c8dee2aaSAndroid Build Coastguard Worker // - Radeon -------------------------------------------------------------------------------
388*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"DeadReturnES3", // b/301326132
389*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicAll", // b/40045114
390*c8dee2aaSAndroid Build Coastguard Worker "MatrixConstructorsES3", // b/40043524
391*c8dee2aaSAndroid Build Coastguard Worker "MatrixScalarNoOpFolding", // b/40044644
392*c8dee2aaSAndroid Build Coastguard Worker "StructIndexStore", // b/40045236
393*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexLookup", // b/40045254
394*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexStore"}) { // b/40045254
395*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Radeon.*(R9|HD)"), "OpenGL", GPU, _});
396*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Radeon.*(R9|HD)"), "ANGLE GL", GPU, _});
397*c8dee2aaSAndroid Build Coastguard Worker }
398*c8dee2aaSAndroid Build Coastguard Worker
399*c8dee2aaSAndroid Build Coastguard Worker // The Radeon Vega 6 doesn't return zero for the derivative of a uniform.
400*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"IntrinsicDFdy",
401*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicDFdx",
402*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicFwidth"}) {
403*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("AMD RADV RENOIR"), _, GPU, _});
404*c8dee2aaSAndroid Build Coastguard Worker }
405*c8dee2aaSAndroid Build Coastguard Worker
406*c8dee2aaSAndroid Build Coastguard Worker // - Adreno -------------------------------------------------------------------------------
407*c8dee2aaSAndroid Build Coastguard Worker // Disable broken tests on Android with Adreno GPUs (b/40043413, b/40045254)
408*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"ArrayCast",
409*c8dee2aaSAndroid Build Coastguard Worker "ArrayComparison",
410*c8dee2aaSAndroid Build Coastguard Worker "CommaSideEffects",
411*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicMixFloatES2",
412*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicClampFloat",
413*c8dee2aaSAndroid Build Coastguard Worker "SwitchWithFallthrough",
414*c8dee2aaSAndroid Build Coastguard Worker "SwitchWithFallthroughGroups",
415*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexLookup",
416*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexStore"}) {
417*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(ADRENO "[3456]"), _, _, kAndroid});
418*c8dee2aaSAndroid Build Coastguard Worker }
419*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"SwitchWithFallthroughGroups",
420*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexLookup",
421*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexStore"}) {
422*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(ADRENO "[7]"), _, _, kAndroid});
423*c8dee2aaSAndroid Build Coastguard Worker }
424*c8dee2aaSAndroid Build Coastguard Worker
425*c8dee2aaSAndroid Build Coastguard Worker // Older Adreno 5/6xx drivers report a pipeline error or silently fail when handling inouts.
426*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"VoidInSequenceExpressions", // b/295217166
427*c8dee2aaSAndroid Build Coastguard Worker "InoutParameters", // b/40043966
428*c8dee2aaSAndroid Build Coastguard Worker "OutParams",
429*c8dee2aaSAndroid Build Coastguard Worker "OutParamsDoubleSwizzle",
430*c8dee2aaSAndroid Build Coastguard Worker "OutParamsNoInline",
431*c8dee2aaSAndroid Build Coastguard Worker "OutParamsFunctionCallInArgument"}) {
432*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(ADRENO "[56]"), "Vulkan", _, kAndroid});
433*c8dee2aaSAndroid Build Coastguard Worker }
434*c8dee2aaSAndroid Build Coastguard Worker
435*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"MatrixToVectorCast", // b/40043288
436*c8dee2aaSAndroid Build Coastguard Worker "StructsInFunctions"}) { // b/40043024
437*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(ADRENO "[345]"), "OpenGL", _, kAndroid});
438*c8dee2aaSAndroid Build Coastguard Worker }
439*c8dee2aaSAndroid Build Coastguard Worker
440*c8dee2aaSAndroid Build Coastguard Worker // Constructing a matrix from vectors and scalars can be surprisingly finicky (b/40043539)
441*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"Matrices",
442*c8dee2aaSAndroid Build Coastguard Worker "MatrixNoOpFolding"}) {
443*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(ADRENO "3"), "OpenGL", _, kAndroid});
444*c8dee2aaSAndroid Build Coastguard Worker }
445*c8dee2aaSAndroid Build Coastguard Worker
446*c8dee2aaSAndroid Build Coastguard Worker // Adreno 600 doesn't handle isinf() in OpenGL correctly. (b/40043464)
447*c8dee2aaSAndroid Build Coastguard Worker disables["IntrinsicIsInf"].push_back({regex(ADRENO "6"), "OpenGL", _, kAndroid});
448*c8dee2aaSAndroid Build Coastguard Worker
449*c8dee2aaSAndroid Build Coastguard Worker // Older Adreno drivers crash when presented with an empty block (b/40044390)
450*c8dee2aaSAndroid Build Coastguard Worker disables["EmptyBlocksES3"].push_back({regex(ADRENO "(540|630)"), _, _, kAndroid});
451*c8dee2aaSAndroid Build Coastguard Worker
452*c8dee2aaSAndroid Build Coastguard Worker // Adrenos alias out-params to globals improperly (b/40044222)
453*c8dee2aaSAndroid Build Coastguard Worker disables["OutParamsAreDistinctFromGlobal"].push_back({regex(ADRENO "[3456]"), "OpenGL",
454*c8dee2aaSAndroid Build Coastguard Worker _, kAndroid});
455*c8dee2aaSAndroid Build Coastguard Worker // Adreno generates the wrong result for this test. (b/40044477)
456*c8dee2aaSAndroid Build Coastguard Worker disables["StructFieldFolding"].push_back({regex(ADRENO "[56]"), "OpenGL",
457*c8dee2aaSAndroid Build Coastguard Worker _, kAndroid});
458*c8dee2aaSAndroid Build Coastguard Worker
459*c8dee2aaSAndroid Build Coastguard Worker // b/318726662
460*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"PrefixExpressionsES2",
461*c8dee2aaSAndroid Build Coastguard Worker "MatrixToVectorCast",
462*c8dee2aaSAndroid Build Coastguard Worker "MatrixConstructorsES2"}) {
463*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex(ADRENO "620"), "Vulkan", Graphite, kAndroid});
464*c8dee2aaSAndroid Build Coastguard Worker }
465*c8dee2aaSAndroid Build Coastguard Worker
466*c8dee2aaSAndroid Build Coastguard Worker // - Intel --------------------------------------------------------------------------------
467*c8dee2aaSAndroid Build Coastguard Worker // Disable various tests on Intel.
468*c8dee2aaSAndroid Build Coastguard Worker // Intrinsic floor() on Intel + ANGLE + DirectX is broken (anglebug.com/5588)
469*c8dee2aaSAndroid Build Coastguard Worker disables["IntrinsicFloor"].push_back({regex("Intel.*(Iris|HD)"), "ANGLE D3D", _, _});
470*c8dee2aaSAndroid Build Coastguard Worker
471*c8dee2aaSAndroid Build Coastguard Worker // Intrinsic not() and mix() are broken on Intel GPUs in Metal. (b/40045105)
472*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"IntrinsicNot",
473*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicMixFloatES3"}) {
474*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel.*(Iris|6000)"), "Metal", _, kMac});
475*c8dee2aaSAndroid Build Coastguard Worker }
476*c8dee2aaSAndroid Build Coastguard Worker
477*c8dee2aaSAndroid Build Coastguard Worker // Swizzled-index store is broken across many Intel GPUs. (b/40045254)
478*c8dee2aaSAndroid Build Coastguard Worker disables["SwizzleIndexStore"].push_back({regex("Intel"), "OpenGL", _, kMac});
479*c8dee2aaSAndroid Build Coastguard Worker disables["SwizzleIndexStore"].push_back({regex("Intel.*Iris"), _, _, kWindows});
480*c8dee2aaSAndroid Build Coastguard Worker
481*c8dee2aaSAndroid Build Coastguard Worker // vec4(mat2) conversions can lead to a crash on Intel + ANGLE (b/40043275)
482*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"VectorToMatrixCast",
483*c8dee2aaSAndroid Build Coastguard Worker "VectorScalarMath",
484*c8dee2aaSAndroid Build Coastguard Worker "TrivialArgumentsInlineDirectly"}) {
485*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel"), "ANGLE", _, kWindows});
486*c8dee2aaSAndroid Build Coastguard Worker }
487*c8dee2aaSAndroid Build Coastguard Worker
488*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"MatrixFoldingES2",
489*c8dee2aaSAndroid Build Coastguard Worker "MatrixEquality",
490*c8dee2aaSAndroid Build Coastguard Worker "TemporaryIndexLookup", // b/40045228
491*c8dee2aaSAndroid Build Coastguard Worker "SwizzleIndexLookup"}) { // b/40045254
492*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel.*(Iris|4400)"), "OpenGL", _, kWindows});
493*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel.*(Iris|4400)"), "ANGLE", _, kWindows});
494*c8dee2aaSAndroid Build Coastguard Worker }
495*c8dee2aaSAndroid Build Coastguard Worker
496*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"ReturnsValueOnEveryPathES3", // b/40043548
497*c8dee2aaSAndroid Build Coastguard Worker "OutParamsAreDistinctFromGlobal", // b/40044222
498*c8dee2aaSAndroid Build Coastguard Worker "StructFieldFolding"}) { // b/40044477
499*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel"), "OpenGL", _, kWindows});
500*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel"), "ANGLE GL", _, kWindows});
501*c8dee2aaSAndroid Build Coastguard Worker }
502*c8dee2aaSAndroid Build Coastguard Worker
503*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"SwitchDefaultOnly", // b/40043548
504*c8dee2aaSAndroid Build Coastguard Worker "ReturnsValueOnEveryPathES3"}) { // b/40045205
505*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel"), "Vulkan", _, kLinux});
506*c8dee2aaSAndroid Build Coastguard Worker }
507*c8dee2aaSAndroid Build Coastguard Worker
508*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"SwitchDefaultOnly"}) {
509*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel"), "ANGLE", _, kWindows});
510*c8dee2aaSAndroid Build Coastguard Worker }
511*c8dee2aaSAndroid Build Coastguard Worker
512*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"SwizzleAsLValueES3"}) { // https://anglebug.com/8260
513*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel"), _, _, kWindows});
514*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({_, "ANGLE", _, kWindows});
515*c8dee2aaSAndroid Build Coastguard Worker }
516*c8dee2aaSAndroid Build Coastguard Worker
517*c8dee2aaSAndroid Build Coastguard Worker // Some Intel GPUs don't return zero for the derivative of a uniform.
518*c8dee2aaSAndroid Build Coastguard Worker for (const char* test : {"IntrinsicDFdy",
519*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicDFdx",
520*c8dee2aaSAndroid Build Coastguard Worker "IntrinsicFwidth"}) {
521*c8dee2aaSAndroid Build Coastguard Worker disables[test].push_back({regex("Intel"), _, GPU, _});
522*c8dee2aaSAndroid Build Coastguard Worker }
523*c8dee2aaSAndroid Build Coastguard Worker
524*c8dee2aaSAndroid Build Coastguard Worker disables["LoopFloat"].push_back({regex("Intel.*(Iris|6000)"), _, _, kMac}); // b/40043507
525*c8dee2aaSAndroid Build Coastguard Worker
526*c8dee2aaSAndroid Build Coastguard Worker #undef ADRENO
527*c8dee2aaSAndroid Build Coastguard Worker #undef NVIDIA
528*c8dee2aaSAndroid Build Coastguard Worker
529*c8dee2aaSAndroid Build Coastguard Worker return disables;
530*c8dee2aaSAndroid Build Coastguard Worker }()};
531*c8dee2aaSAndroid Build Coastguard Worker
532*c8dee2aaSAndroid Build Coastguard Worker if (const std::vector<TestDisable>* testDisables = testDisableMap->find(name)) {
533*c8dee2aaSAndroid Build Coastguard Worker for (const TestDisable& d : *testDisables) {
534*c8dee2aaSAndroid Build Coastguard Worker if (d.platform.has_value() && !*d.platform) {
535*c8dee2aaSAndroid Build Coastguard Worker continue; // disable applies to a different platform
536*c8dee2aaSAndroid Build Coastguard Worker }
537*c8dee2aaSAndroid Build Coastguard Worker if (d.backendAPI.has_value() && !skstd::contains(backendAPI, *d.backendAPI)) {
538*c8dee2aaSAndroid Build Coastguard Worker continue; // disable applies to a different backend API
539*c8dee2aaSAndroid Build Coastguard Worker }
540*c8dee2aaSAndroid Build Coastguard Worker if (d.deviceName.has_value() &&
541*c8dee2aaSAndroid Build Coastguard Worker !std::regex_search(deviceName.begin(), deviceName.end(), *d.deviceName)) {
542*c8dee2aaSAndroid Build Coastguard Worker continue; // disable applies to a different device
543*c8dee2aaSAndroid Build Coastguard Worker }
544*c8dee2aaSAndroid Build Coastguard Worker if (d.testTypeMatcher == CPU && testType != skiatest::TestType::kCPU) {
545*c8dee2aaSAndroid Build Coastguard Worker continue; // disable only applies to CPU
546*c8dee2aaSAndroid Build Coastguard Worker }
547*c8dee2aaSAndroid Build Coastguard Worker if (d.testTypeMatcher == Ganesh && testType != skiatest::TestType::kGanesh) {
548*c8dee2aaSAndroid Build Coastguard Worker continue; // disable only applies to Ganesh
549*c8dee2aaSAndroid Build Coastguard Worker }
550*c8dee2aaSAndroid Build Coastguard Worker if (d.testTypeMatcher == Graphite && testType != skiatest::TestType::kGraphite) {
551*c8dee2aaSAndroid Build Coastguard Worker continue; // disable only applies to Graphites
552*c8dee2aaSAndroid Build Coastguard Worker }
553*c8dee2aaSAndroid Build Coastguard Worker if (d.testTypeMatcher == GPU && testType == skiatest::TestType::kCPU) {
554*c8dee2aaSAndroid Build Coastguard Worker continue; // disable only applies to GPU
555*c8dee2aaSAndroid Build Coastguard Worker }
556*c8dee2aaSAndroid Build Coastguard Worker // This test was disabled.
557*c8dee2aaSAndroid Build Coastguard Worker return true;
558*c8dee2aaSAndroid Build Coastguard Worker }
559*c8dee2aaSAndroid Build Coastguard Worker }
560*c8dee2aaSAndroid Build Coastguard Worker
561*c8dee2aaSAndroid Build Coastguard Worker // This test was not in our disable list.
562*c8dee2aaSAndroid Build Coastguard Worker return false;
563*c8dee2aaSAndroid Build Coastguard Worker }
564*c8dee2aaSAndroid Build Coastguard Worker
test_one_permutation(skiatest::Reporter * r,std::string_view deviceName,std::string_view backendAPI,SkSurface * surface,const char * name,const char * testFile,skiatest::TestType testType,const char * permutationSuffix,const SkRuntimeEffect::Options & options)565*c8dee2aaSAndroid Build Coastguard Worker static void test_one_permutation(skiatest::Reporter* r,
566*c8dee2aaSAndroid Build Coastguard Worker std::string_view deviceName,
567*c8dee2aaSAndroid Build Coastguard Worker std::string_view backendAPI,
568*c8dee2aaSAndroid Build Coastguard Worker SkSurface* surface,
569*c8dee2aaSAndroid Build Coastguard Worker const char* name,
570*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
571*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType testType,
572*c8dee2aaSAndroid Build Coastguard Worker const char* permutationSuffix,
573*c8dee2aaSAndroid Build Coastguard Worker const SkRuntimeEffect::Options& options) {
574*c8dee2aaSAndroid Build Coastguard Worker SkString shaderString = load_source(r, testFile, permutationSuffix);
575*c8dee2aaSAndroid Build Coastguard Worker if (shaderString.isEmpty()) {
576*c8dee2aaSAndroid Build Coastguard Worker return;
577*c8dee2aaSAndroid Build Coastguard Worker }
578*c8dee2aaSAndroid Build Coastguard Worker SkRuntimeEffect::Result result = SkRuntimeEffect::MakeForShader(shaderString, options);
579*c8dee2aaSAndroid Build Coastguard Worker if (!result.effect) {
580*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s%s: %s", testFile, permutationSuffix, result.errorText.c_str());
581*c8dee2aaSAndroid Build Coastguard Worker return;
582*c8dee2aaSAndroid Build Coastguard Worker }
583*c8dee2aaSAndroid Build Coastguard Worker if (failure_is_expected(deviceName, backendAPI, name, testType)) {
584*c8dee2aaSAndroid Build Coastguard Worker // Some driver bugs can be catastrophic (e.g. crashing dm entirely), so we don't even try to
585*c8dee2aaSAndroid Build Coastguard Worker // run a shader if we expect that it might fail.
586*c8dee2aaSAndroid Build Coastguard Worker SkDebugf("%s: skipped %.*s%s\n", testFile, (int)backendAPI.size(), backendAPI.data(),
587*c8dee2aaSAndroid Build Coastguard Worker permutationSuffix);
588*c8dee2aaSAndroid Build Coastguard Worker return;
589*c8dee2aaSAndroid Build Coastguard Worker }
590*c8dee2aaSAndroid Build Coastguard Worker
591*c8dee2aaSAndroid Build Coastguard Worker SkBitmap bitmap = bitmap_from_shader(r, surface, result.effect);
592*c8dee2aaSAndroid Build Coastguard Worker if (bitmap.empty()) {
593*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s%s: Unable to build shader", testFile, permutationSuffix);
594*c8dee2aaSAndroid Build Coastguard Worker return;
595*c8dee2aaSAndroid Build Coastguard Worker }
596*c8dee2aaSAndroid Build Coastguard Worker
597*c8dee2aaSAndroid Build Coastguard Worker bool success = true;
598*c8dee2aaSAndroid Build Coastguard Worker SkColor color[kHeight][kWidth];
599*c8dee2aaSAndroid Build Coastguard Worker for (int y = 0; y < kHeight; ++y) {
600*c8dee2aaSAndroid Build Coastguard Worker for (int x = 0; x < kWidth; ++x) {
601*c8dee2aaSAndroid Build Coastguard Worker color[y][x] = bitmap.getColor(x, y);
602*c8dee2aaSAndroid Build Coastguard Worker if (color[y][x] != SK_ColorGREEN) {
603*c8dee2aaSAndroid Build Coastguard Worker success = false;
604*c8dee2aaSAndroid Build Coastguard Worker }
605*c8dee2aaSAndroid Build Coastguard Worker }
606*c8dee2aaSAndroid Build Coastguard Worker }
607*c8dee2aaSAndroid Build Coastguard Worker
608*c8dee2aaSAndroid Build Coastguard Worker if (!success) {
609*c8dee2aaSAndroid Build Coastguard Worker static_assert(kWidth == 2);
610*c8dee2aaSAndroid Build Coastguard Worker static_assert(kHeight == 2);
611*c8dee2aaSAndroid Build Coastguard Worker
612*c8dee2aaSAndroid Build Coastguard Worker SkString message = SkStringPrintf("Expected%s: solid green. Actual output from %.*s using "
613*c8dee2aaSAndroid Build Coastguard Worker "%.*s:\n"
614*c8dee2aaSAndroid Build Coastguard Worker "RRGGBBAA RRGGBBAA\n"
615*c8dee2aaSAndroid Build Coastguard Worker "%02X%02X%02X%02X %02X%02X%02X%02X\n"
616*c8dee2aaSAndroid Build Coastguard Worker "%02X%02X%02X%02X %02X%02X%02X%02X",
617*c8dee2aaSAndroid Build Coastguard Worker permutationSuffix,
618*c8dee2aaSAndroid Build Coastguard Worker (int)deviceName.size(), deviceName.data(),
619*c8dee2aaSAndroid Build Coastguard Worker (int)backendAPI.size(), backendAPI.data(),
620*c8dee2aaSAndroid Build Coastguard Worker
621*c8dee2aaSAndroid Build Coastguard Worker SkColorGetR(color[0][0]), SkColorGetG(color[0][0]),
622*c8dee2aaSAndroid Build Coastguard Worker SkColorGetB(color[0][0]), SkColorGetA(color[0][0]),
623*c8dee2aaSAndroid Build Coastguard Worker
624*c8dee2aaSAndroid Build Coastguard Worker SkColorGetR(color[0][1]), SkColorGetG(color[0][1]),
625*c8dee2aaSAndroid Build Coastguard Worker SkColorGetB(color[0][1]), SkColorGetA(color[0][1]),
626*c8dee2aaSAndroid Build Coastguard Worker
627*c8dee2aaSAndroid Build Coastguard Worker SkColorGetR(color[1][0]), SkColorGetG(color[1][0]),
628*c8dee2aaSAndroid Build Coastguard Worker SkColorGetB(color[1][0]), SkColorGetA(color[1][0]),
629*c8dee2aaSAndroid Build Coastguard Worker
630*c8dee2aaSAndroid Build Coastguard Worker SkColorGetR(color[1][1]), SkColorGetG(color[1][1]),
631*c8dee2aaSAndroid Build Coastguard Worker SkColorGetB(color[1][1]), SkColorGetA(color[1][1]));
632*c8dee2aaSAndroid Build Coastguard Worker
633*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s", message.c_str());
634*c8dee2aaSAndroid Build Coastguard Worker }
635*c8dee2aaSAndroid Build Coastguard Worker }
636*c8dee2aaSAndroid Build Coastguard Worker
test_permutations(skiatest::Reporter * r,std::string_view deviceName,std::string_view backendAPI,SkSurface * surface,const char * name,const char * testFile,skiatest::TestType testType,bool strictES2,bool privateAccess)637*c8dee2aaSAndroid Build Coastguard Worker static void test_permutations(skiatest::Reporter* r,
638*c8dee2aaSAndroid Build Coastguard Worker std::string_view deviceName,
639*c8dee2aaSAndroid Build Coastguard Worker std::string_view backendAPI,
640*c8dee2aaSAndroid Build Coastguard Worker SkSurface* surface,
641*c8dee2aaSAndroid Build Coastguard Worker const char* name,
642*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
643*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType testType,
644*c8dee2aaSAndroid Build Coastguard Worker bool strictES2,
645*c8dee2aaSAndroid Build Coastguard Worker bool privateAccess) {
646*c8dee2aaSAndroid Build Coastguard Worker SkRuntimeEffect::Options options = strictES2 ? SkRuntimeEffect::Options{}
647*c8dee2aaSAndroid Build Coastguard Worker : SkRuntimeEffectPriv::ES3Options();
648*c8dee2aaSAndroid Build Coastguard Worker if (privateAccess) {
649*c8dee2aaSAndroid Build Coastguard Worker SkRuntimeEffectPriv::AllowPrivateAccess(&options);
650*c8dee2aaSAndroid Build Coastguard Worker }
651*c8dee2aaSAndroid Build Coastguard Worker options.forceUnoptimized = false;
652*c8dee2aaSAndroid Build Coastguard Worker test_one_permutation(r, deviceName, backendAPI, surface, name, testFile, testType, "", options);
653*c8dee2aaSAndroid Build Coastguard Worker
654*c8dee2aaSAndroid Build Coastguard Worker options.forceUnoptimized = true;
655*c8dee2aaSAndroid Build Coastguard Worker test_one_permutation(r, deviceName, backendAPI, surface, name, testFile, testType,
656*c8dee2aaSAndroid Build Coastguard Worker " (Unoptimized)", options);
657*c8dee2aaSAndroid Build Coastguard Worker }
658*c8dee2aaSAndroid Build Coastguard Worker
test_cpu(skiatest::Reporter * r,const char * name,const char * testFile,SkSLTestFlags flags)659*c8dee2aaSAndroid Build Coastguard Worker static void test_cpu(skiatest::Reporter* r,
660*c8dee2aaSAndroid Build Coastguard Worker const char* name,
661*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
662*c8dee2aaSAndroid Build Coastguard Worker SkSLTestFlags flags) {
663*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(flags & SkSLTestFlag::CPU);
664*c8dee2aaSAndroid Build Coastguard Worker
665*c8dee2aaSAndroid Build Coastguard Worker // Create a raster-backed surface.
666*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight);
667*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface(SkSurfaces::Raster(info));
668*c8dee2aaSAndroid Build Coastguard Worker bool privateAccess = bool(flags & SkSLTestFlag::Priv);
669*c8dee2aaSAndroid Build Coastguard Worker
670*c8dee2aaSAndroid Build Coastguard Worker test_permutations(r, "CPU", "SkRP", surface.get(), name, testFile,
671*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType::kCPU, /*strictES2=*/true, privateAccess);
672*c8dee2aaSAndroid Build Coastguard Worker }
673*c8dee2aaSAndroid Build Coastguard Worker
674*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH)
test_ganesh(skiatest::Reporter * r,const sk_gpu_test::ContextInfo & ctxInfo,const char * name,const char * testFile,SkSLTestFlags flags)675*c8dee2aaSAndroid Build Coastguard Worker static void test_ganesh(skiatest::Reporter* r,
676*c8dee2aaSAndroid Build Coastguard Worker const sk_gpu_test::ContextInfo& ctxInfo,
677*c8dee2aaSAndroid Build Coastguard Worker const char* name,
678*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
679*c8dee2aaSAndroid Build Coastguard Worker SkSLTestFlags flags) {
680*c8dee2aaSAndroid Build Coastguard Worker GrDirectContext *ctx = ctxInfo.directContext();
681*c8dee2aaSAndroid Build Coastguard Worker
682*c8dee2aaSAndroid Build Coastguard Worker // If this is an ES3-only test on a GPU which doesn't support SkSL ES3, return immediately.
683*c8dee2aaSAndroid Build Coastguard Worker bool shouldRunGPU = SkToBool(flags & SkSLTestFlag::GPU);
684*c8dee2aaSAndroid Build Coastguard Worker bool shouldRunGPU_ES3 =
685*c8dee2aaSAndroid Build Coastguard Worker (flags & SkSLTestFlag::GPU_ES3) &&
686*c8dee2aaSAndroid Build Coastguard Worker (ctx->priv().caps()->shaderCaps()->supportedSkSLVerion() >= SkSL::Version::k300);
687*c8dee2aaSAndroid Build Coastguard Worker if (!shouldRunGPU && !shouldRunGPU_ES3) {
688*c8dee2aaSAndroid Build Coastguard Worker return;
689*c8dee2aaSAndroid Build Coastguard Worker }
690*c8dee2aaSAndroid Build Coastguard Worker
691*c8dee2aaSAndroid Build Coastguard Worker // If this is a test that requires the GPU to generate NaN values, check for that first.
692*c8dee2aaSAndroid Build Coastguard Worker if (flags & SkSLTestFlag::UsesNaN) {
693*c8dee2aaSAndroid Build Coastguard Worker if (!gpu_generates_nan(r, ctx)) {
694*c8dee2aaSAndroid Build Coastguard Worker return;
695*c8dee2aaSAndroid Build Coastguard Worker }
696*c8dee2aaSAndroid Build Coastguard Worker }
697*c8dee2aaSAndroid Build Coastguard Worker
698*c8dee2aaSAndroid Build Coastguard Worker // Create a GPU-backed Ganesh surface.
699*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo info = SkImageInfo::MakeN32Premul(kWidth, kHeight);
700*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface(SkSurfaces::RenderTarget(ctx, skgpu::Budgeted::kNo, info));
701*c8dee2aaSAndroid Build Coastguard Worker std::string_view deviceName = ctx->priv().caps()->deviceName();
702*c8dee2aaSAndroid Build Coastguard Worker std::string_view backendAPI = skgpu::ContextTypeName(ctxInfo.type());
703*c8dee2aaSAndroid Build Coastguard Worker bool privateAccess = bool(flags & SkSLTestFlag::Priv);
704*c8dee2aaSAndroid Build Coastguard Worker
705*c8dee2aaSAndroid Build Coastguard Worker if (shouldRunGPU) {
706*c8dee2aaSAndroid Build Coastguard Worker test_permutations(r, deviceName, backendAPI, surface.get(), name, testFile,
707*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType::kGanesh, /*strictES2=*/true, privateAccess);
708*c8dee2aaSAndroid Build Coastguard Worker }
709*c8dee2aaSAndroid Build Coastguard Worker if (shouldRunGPU_ES3) {
710*c8dee2aaSAndroid Build Coastguard Worker test_permutations(r, deviceName, backendAPI, surface.get(), name, testFile,
711*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType::kGanesh, /*strictES2=*/false, privateAccess);
712*c8dee2aaSAndroid Build Coastguard Worker }
713*c8dee2aaSAndroid Build Coastguard Worker }
714*c8dee2aaSAndroid Build Coastguard Worker #endif
715*c8dee2aaSAndroid Build Coastguard Worker
716*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
717*c8dee2aaSAndroid Build Coastguard Worker // Note: SKSL_TEST sets CTS enforcement API level to max(kApiLevel_V, ctsEnforcement) for Graphite.
test_graphite(skiatest::Reporter * r,skgpu::graphite::Context * ctx,skiatest::graphite::GraphiteTestContext * testCtx,const char * name,const char * testFile,SkSLTestFlags flags)718*c8dee2aaSAndroid Build Coastguard Worker static void test_graphite(skiatest::Reporter* r,
719*c8dee2aaSAndroid Build Coastguard Worker skgpu::graphite::Context* ctx,
720*c8dee2aaSAndroid Build Coastguard Worker skiatest::graphite::GraphiteTestContext* testCtx,
721*c8dee2aaSAndroid Build Coastguard Worker const char* name,
722*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
723*c8dee2aaSAndroid Build Coastguard Worker SkSLTestFlags flags) {
724*c8dee2aaSAndroid Build Coastguard Worker // If this is an ES3-only test on a GPU which doesn't support SkSL ES3, return immediately.
725*c8dee2aaSAndroid Build Coastguard Worker bool shouldRunGPU = SkToBool(flags & SkSLTestFlag::GPU);
726*c8dee2aaSAndroid Build Coastguard Worker bool shouldRunGPU_ES3 =
727*c8dee2aaSAndroid Build Coastguard Worker (flags & SkSLTestFlag::GPU_ES3) &&
728*c8dee2aaSAndroid Build Coastguard Worker (ctx->priv().caps()->shaderCaps()->supportedSkSLVerion() >= SkSL::Version::k300);
729*c8dee2aaSAndroid Build Coastguard Worker if (!shouldRunGPU && !shouldRunGPU_ES3) {
730*c8dee2aaSAndroid Build Coastguard Worker return;
731*c8dee2aaSAndroid Build Coastguard Worker }
732*c8dee2aaSAndroid Build Coastguard Worker
733*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_DAWN)
734*c8dee2aaSAndroid Build Coastguard Worker if (ctx->backend() == skgpu::BackendApi::kDawn) {
735*c8dee2aaSAndroid Build Coastguard Worker // If this is a test that requires the GPU to generate NaN values, we don't run it in Dawn.
736*c8dee2aaSAndroid Build Coastguard Worker // (WGSL/Dawn does not support infinity or NaN even if the GPU natively does.)
737*c8dee2aaSAndroid Build Coastguard Worker if (flags & SkSLTestFlag::UsesNaN) {
738*c8dee2aaSAndroid Build Coastguard Worker return;
739*c8dee2aaSAndroid Build Coastguard Worker }
740*c8dee2aaSAndroid Build Coastguard Worker }
741*c8dee2aaSAndroid Build Coastguard Worker #endif
742*c8dee2aaSAndroid Build Coastguard Worker
743*c8dee2aaSAndroid Build Coastguard Worker // Create a GPU-backed Graphite surface.
744*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<skgpu::graphite::Recorder> recorder = ctx->makeRecorder();
745*c8dee2aaSAndroid Build Coastguard Worker
746*c8dee2aaSAndroid Build Coastguard Worker const SkImageInfo info = SkImageInfo::Make({kWidth, kHeight},
747*c8dee2aaSAndroid Build Coastguard Worker kRGBA_8888_SkColorType,
748*c8dee2aaSAndroid Build Coastguard Worker kPremul_SkAlphaType);
749*c8dee2aaSAndroid Build Coastguard Worker sk_sp<SkSurface> surface = SkSurfaces::RenderTarget(recorder.get(), info);
750*c8dee2aaSAndroid Build Coastguard Worker std::string_view deviceName = ctx->priv().caps()->deviceName();
751*c8dee2aaSAndroid Build Coastguard Worker std::string_view backendAPI = skgpu::ContextTypeName(testCtx->contextType());
752*c8dee2aaSAndroid Build Coastguard Worker bool privateAccess = bool(flags & SkSLTestFlag::Priv);
753*c8dee2aaSAndroid Build Coastguard Worker
754*c8dee2aaSAndroid Build Coastguard Worker if (shouldRunGPU) {
755*c8dee2aaSAndroid Build Coastguard Worker test_permutations(r, deviceName, backendAPI, surface.get(), name, testFile,
756*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType::kGraphite, /*strictES2=*/true, privateAccess);
757*c8dee2aaSAndroid Build Coastguard Worker }
758*c8dee2aaSAndroid Build Coastguard Worker if (shouldRunGPU_ES3) {
759*c8dee2aaSAndroid Build Coastguard Worker test_permutations(r, deviceName, backendAPI, surface.get(), name, testFile,
760*c8dee2aaSAndroid Build Coastguard Worker skiatest::TestType::kGraphite, /*strictES2=*/false, privateAccess);
761*c8dee2aaSAndroid Build Coastguard Worker }
762*c8dee2aaSAndroid Build Coastguard Worker }
763*c8dee2aaSAndroid Build Coastguard Worker #endif
764*c8dee2aaSAndroid Build Coastguard Worker
test_clone(skiatest::Reporter * r,const char * testFile,SkSLTestFlags flags)765*c8dee2aaSAndroid Build Coastguard Worker static void test_clone(skiatest::Reporter* r, const char* testFile, SkSLTestFlags flags) {
766*c8dee2aaSAndroid Build Coastguard Worker SkString shaderString = load_source(r, testFile, "");
767*c8dee2aaSAndroid Build Coastguard Worker if (shaderString.isEmpty()) {
768*c8dee2aaSAndroid Build Coastguard Worker return;
769*c8dee2aaSAndroid Build Coastguard Worker }
770*c8dee2aaSAndroid Build Coastguard Worker SkSL::ProgramSettings settings;
771*c8dee2aaSAndroid Build Coastguard Worker // TODO(skia:11209): Can we just put the correct #version in the source files that need this?
772*c8dee2aaSAndroid Build Coastguard Worker settings.fMaxVersionAllowed = is_strict_es2(flags) ? SkSL::Version::k100 : SkSL::Version::k300;
773*c8dee2aaSAndroid Build Coastguard Worker SkSL::ProgramKind kind = bool(flags & SkSLTestFlag::Priv)
774*c8dee2aaSAndroid Build Coastguard Worker ? SkSL::ProgramKind::kPrivateRuntimeShader
775*c8dee2aaSAndroid Build Coastguard Worker : SkSL::ProgramKind::kRuntimeShader;
776*c8dee2aaSAndroid Build Coastguard Worker SkSL::Compiler compiler;
777*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, shaderString.c_str(),
778*c8dee2aaSAndroid Build Coastguard Worker settings);
779*c8dee2aaSAndroid Build Coastguard Worker if (!program) {
780*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s", compiler.errorText().c_str());
781*c8dee2aaSAndroid Build Coastguard Worker return;
782*c8dee2aaSAndroid Build Coastguard Worker }
783*c8dee2aaSAndroid Build Coastguard Worker
784*c8dee2aaSAndroid Build Coastguard Worker // Clone every expression in the program, and ensure that its clone generates the same
785*c8dee2aaSAndroid Build Coastguard Worker // description as the original.
786*c8dee2aaSAndroid Build Coastguard Worker class CloneVisitor : public SkSL::ProgramVisitor {
787*c8dee2aaSAndroid Build Coastguard Worker public:
788*c8dee2aaSAndroid Build Coastguard Worker CloneVisitor(skiatest::Reporter* r) : fReporter(r) {}
789*c8dee2aaSAndroid Build Coastguard Worker
790*c8dee2aaSAndroid Build Coastguard Worker bool visitExpression(const SkSL::Expression& expr) override {
791*c8dee2aaSAndroid Build Coastguard Worker std::string original = expr.description();
792*c8dee2aaSAndroid Build Coastguard Worker std::string cloned = expr.clone()->description();
793*c8dee2aaSAndroid Build Coastguard Worker REPORTER_ASSERT(fReporter, original == cloned,
794*c8dee2aaSAndroid Build Coastguard Worker "Mismatch after clone!\nOriginal: %s\nCloned: %s\n",
795*c8dee2aaSAndroid Build Coastguard Worker original.c_str(), cloned.c_str());
796*c8dee2aaSAndroid Build Coastguard Worker
797*c8dee2aaSAndroid Build Coastguard Worker return INHERITED::visitExpression(expr);
798*c8dee2aaSAndroid Build Coastguard Worker }
799*c8dee2aaSAndroid Build Coastguard Worker
800*c8dee2aaSAndroid Build Coastguard Worker skiatest::Reporter* fReporter;
801*c8dee2aaSAndroid Build Coastguard Worker
802*c8dee2aaSAndroid Build Coastguard Worker using INHERITED = ProgramVisitor;
803*c8dee2aaSAndroid Build Coastguard Worker };
804*c8dee2aaSAndroid Build Coastguard Worker
805*c8dee2aaSAndroid Build Coastguard Worker CloneVisitor{r}.visit(*program);
806*c8dee2aaSAndroid Build Coastguard Worker }
807*c8dee2aaSAndroid Build Coastguard Worker
report_rp_pass(skiatest::Reporter * r,const char * testFile,SkSLTestFlags flags)808*c8dee2aaSAndroid Build Coastguard Worker static void report_rp_pass(skiatest::Reporter* r, const char* testFile, SkSLTestFlags flags) {
809*c8dee2aaSAndroid Build Coastguard Worker if (!(flags & SkSLTestFlag::CPU) && !(flags & SkSLTestFlag::ES3)) {
810*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "NEW: %s", testFile);
811*c8dee2aaSAndroid Build Coastguard Worker }
812*c8dee2aaSAndroid Build Coastguard Worker }
813*c8dee2aaSAndroid Build Coastguard Worker
report_rp_fail(skiatest::Reporter * r,const char * testFile,SkSLTestFlags flags,const char * reason)814*c8dee2aaSAndroid Build Coastguard Worker static void report_rp_fail(skiatest::Reporter* r,
815*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
816*c8dee2aaSAndroid Build Coastguard Worker SkSLTestFlags flags,
817*c8dee2aaSAndroid Build Coastguard Worker const char* reason) {
818*c8dee2aaSAndroid Build Coastguard Worker if ((flags & SkSLTestFlag::CPU) || (flags & SkSLTestFlag::ES3)) {
819*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s: %s", testFile, reason);
820*c8dee2aaSAndroid Build Coastguard Worker }
821*c8dee2aaSAndroid Build Coastguard Worker }
822*c8dee2aaSAndroid Build Coastguard Worker
test_raster_pipeline(skiatest::Reporter * r,const char * testFile,SkSLTestFlags flags)823*c8dee2aaSAndroid Build Coastguard Worker static void test_raster_pipeline(skiatest::Reporter* r,
824*c8dee2aaSAndroid Build Coastguard Worker const char* testFile,
825*c8dee2aaSAndroid Build Coastguard Worker SkSLTestFlags flags) {
826*c8dee2aaSAndroid Build Coastguard Worker SkString shaderString = load_source(r, testFile, "");
827*c8dee2aaSAndroid Build Coastguard Worker if (shaderString.isEmpty()) {
828*c8dee2aaSAndroid Build Coastguard Worker return;
829*c8dee2aaSAndroid Build Coastguard Worker }
830*c8dee2aaSAndroid Build Coastguard Worker
831*c8dee2aaSAndroid Build Coastguard Worker // In Raster Pipeline, we can compile and run test shaders directly, without involving a surface
832*c8dee2aaSAndroid Build Coastguard Worker // at all.
833*c8dee2aaSAndroid Build Coastguard Worker SkSL::Compiler compiler;
834*c8dee2aaSAndroid Build Coastguard Worker SkSL::ProgramSettings settings;
835*c8dee2aaSAndroid Build Coastguard Worker settings.fMaxVersionAllowed = SkSL::Version::k300;
836*c8dee2aaSAndroid Build Coastguard Worker SkSL::ProgramKind kind = bool(flags & SkSLTestFlag::Priv)
837*c8dee2aaSAndroid Build Coastguard Worker ? SkSL::ProgramKind::kPrivateRuntimeShader
838*c8dee2aaSAndroid Build Coastguard Worker : SkSL::ProgramKind::kRuntimeShader;
839*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSL::Program> program = compiler.convertProgram(kind, shaderString.c_str(),
840*c8dee2aaSAndroid Build Coastguard Worker settings);
841*c8dee2aaSAndroid Build Coastguard Worker if (!program) {
842*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s: Unexpected compilation error\n%s", testFile, compiler.errorText().c_str());
843*c8dee2aaSAndroid Build Coastguard Worker return;
844*c8dee2aaSAndroid Build Coastguard Worker }
845*c8dee2aaSAndroid Build Coastguard Worker const SkSL::FunctionDeclaration* main = program->getFunction("main");
846*c8dee2aaSAndroid Build Coastguard Worker if (!main) {
847*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s: Program must have a 'main' function", testFile);
848*c8dee2aaSAndroid Build Coastguard Worker return;
849*c8dee2aaSAndroid Build Coastguard Worker }
850*c8dee2aaSAndroid Build Coastguard Worker
851*c8dee2aaSAndroid Build Coastguard Worker // Match up uniforms from the program against our list of test uniforms, and build up a data
852*c8dee2aaSAndroid Build Coastguard Worker // buffer of uniform floats.
853*c8dee2aaSAndroid Build Coastguard Worker size_t offset = 0;
854*c8dee2aaSAndroid Build Coastguard Worker TArray<SkRuntimeEffect::Uniform> uniforms;
855*c8dee2aaSAndroid Build Coastguard Worker TArray<std::string_view> childEffects;
856*c8dee2aaSAndroid Build Coastguard Worker const SkSL::Context& ctx(compiler.context());
857*c8dee2aaSAndroid Build Coastguard Worker
858*c8dee2aaSAndroid Build Coastguard Worker for (const SkSL::ProgramElement* elem : program->elements()) {
859*c8dee2aaSAndroid Build Coastguard Worker // Variables (uniform, etc.)
860*c8dee2aaSAndroid Build Coastguard Worker if (elem->is<SkSL::GlobalVarDeclaration>()) {
861*c8dee2aaSAndroid Build Coastguard Worker const SkSL::GlobalVarDeclaration& global = elem->as<SkSL::GlobalVarDeclaration>();
862*c8dee2aaSAndroid Build Coastguard Worker const SkSL::VarDeclaration& varDecl = global.declaration()->as<SkSL::VarDeclaration>();
863*c8dee2aaSAndroid Build Coastguard Worker const SkSL::Variable& var = *varDecl.var();
864*c8dee2aaSAndroid Build Coastguard Worker
865*c8dee2aaSAndroid Build Coastguard Worker // Keep track of child effects.
866*c8dee2aaSAndroid Build Coastguard Worker if (var.type().isEffectChild()) {
867*c8dee2aaSAndroid Build Coastguard Worker childEffects.push_back(var.name());
868*c8dee2aaSAndroid Build Coastguard Worker continue;
869*c8dee2aaSAndroid Build Coastguard Worker }
870*c8dee2aaSAndroid Build Coastguard Worker // 'uniform' variables
871*c8dee2aaSAndroid Build Coastguard Worker if (var.modifierFlags().isUniform()) {
872*c8dee2aaSAndroid Build Coastguard Worker uniforms.push_back(SkRuntimeEffectPriv::VarAsUniform(var, ctx, &offset));
873*c8dee2aaSAndroid Build Coastguard Worker }
874*c8dee2aaSAndroid Build Coastguard Worker }
875*c8dee2aaSAndroid Build Coastguard Worker }
876*c8dee2aaSAndroid Build Coastguard Worker
877*c8dee2aaSAndroid Build Coastguard Worker TArray<float> uniformValues;
878*c8dee2aaSAndroid Build Coastguard Worker for (const SkRuntimeEffect::Uniform& programUniform : uniforms) {
879*c8dee2aaSAndroid Build Coastguard Worker bool foundMatch = false;
880*c8dee2aaSAndroid Build Coastguard Worker for (const UniformData& data : kUniformData) {
881*c8dee2aaSAndroid Build Coastguard Worker if (data.name == programUniform.name) {
882*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(data.span.size() * sizeof(float) == programUniform.sizeInBytes());
883*c8dee2aaSAndroid Build Coastguard Worker foundMatch = true;
884*c8dee2aaSAndroid Build Coastguard Worker uniformValues.push_back_n(data.span.size(), data.span.data());
885*c8dee2aaSAndroid Build Coastguard Worker break;
886*c8dee2aaSAndroid Build Coastguard Worker }
887*c8dee2aaSAndroid Build Coastguard Worker }
888*c8dee2aaSAndroid Build Coastguard Worker if (!foundMatch) {
889*c8dee2aaSAndroid Build Coastguard Worker report_rp_fail(r, testFile, flags, "unsupported uniform");
890*c8dee2aaSAndroid Build Coastguard Worker return;
891*c8dee2aaSAndroid Build Coastguard Worker }
892*c8dee2aaSAndroid Build Coastguard Worker }
893*c8dee2aaSAndroid Build Coastguard Worker
894*c8dee2aaSAndroid Build Coastguard Worker // Compile our program.
895*c8dee2aaSAndroid Build Coastguard Worker SkArenaAlloc alloc(/*firstHeapAllocation=*/1000);
896*c8dee2aaSAndroid Build Coastguard Worker SkRasterPipeline pipeline(&alloc);
897*c8dee2aaSAndroid Build Coastguard Worker SkSL::DebugTracePriv debugTrace;
898*c8dee2aaSAndroid Build Coastguard Worker std::unique_ptr<SkSL::RP::Program> rasterProg =
899*c8dee2aaSAndroid Build Coastguard Worker SkSL::MakeRasterPipelineProgram(*program,
900*c8dee2aaSAndroid Build Coastguard Worker *main->definition(),
901*c8dee2aaSAndroid Build Coastguard Worker &debugTrace);
902*c8dee2aaSAndroid Build Coastguard Worker if (!rasterProg) {
903*c8dee2aaSAndroid Build Coastguard Worker report_rp_fail(r, testFile, flags, "code is not supported");
904*c8dee2aaSAndroid Build Coastguard Worker return;
905*c8dee2aaSAndroid Build Coastguard Worker }
906*c8dee2aaSAndroid Build Coastguard Worker
907*c8dee2aaSAndroid Build Coastguard Worker // Create callbacks which implement `shaderGreen` and `shaderRed` shaders. Fortunately, these
908*c8dee2aaSAndroid Build Coastguard Worker // are trivial to implement directly in Raster Pipeline.
909*c8dee2aaSAndroid Build Coastguard Worker struct RPCallbacks : public SkSL::RP::Callbacks {
910*c8dee2aaSAndroid Build Coastguard Worker RPCallbacks(SkRasterPipeline* p, SkArenaAlloc* a, const TArray<std::string_view>* c)
911*c8dee2aaSAndroid Build Coastguard Worker : fPipeline(p)
912*c8dee2aaSAndroid Build Coastguard Worker , fAlloc(a)
913*c8dee2aaSAndroid Build Coastguard Worker , fChildEffects(c) {}
914*c8dee2aaSAndroid Build Coastguard Worker
915*c8dee2aaSAndroid Build Coastguard Worker bool appendShader(int index) override {
916*c8dee2aaSAndroid Build Coastguard Worker if (fChildEffects->at(index) == "shaderGreen") {
917*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kColorGreen[4] = {0.0f, 1.0f, 0.0f, 1.0f};
918*c8dee2aaSAndroid Build Coastguard Worker fPipeline->appendConstantColor(fAlloc, kColorGreen);
919*c8dee2aaSAndroid Build Coastguard Worker return true;
920*c8dee2aaSAndroid Build Coastguard Worker }
921*c8dee2aaSAndroid Build Coastguard Worker if (fChildEffects->at(index) == "shaderRed") {
922*c8dee2aaSAndroid Build Coastguard Worker static constexpr float kColorRed[4] = {1.0f, 0.0f, 0.0f, 1.0f};
923*c8dee2aaSAndroid Build Coastguard Worker fPipeline->appendConstantColor(fAlloc, kColorRed);
924*c8dee2aaSAndroid Build Coastguard Worker return true;
925*c8dee2aaSAndroid Build Coastguard Worker }
926*c8dee2aaSAndroid Build Coastguard Worker SK_ABORT("unrecognized RP effect");
927*c8dee2aaSAndroid Build Coastguard Worker }
928*c8dee2aaSAndroid Build Coastguard Worker
929*c8dee2aaSAndroid Build Coastguard Worker bool appendColorFilter(int index) override { SK_ABORT("unsupported RP callback"); }
930*c8dee2aaSAndroid Build Coastguard Worker bool appendBlender(int index) override { SK_ABORT("unsupported RP callback"); }
931*c8dee2aaSAndroid Build Coastguard Worker void toLinearSrgb(const void* color) override { SK_ABORT("unsupported RP callback"); }
932*c8dee2aaSAndroid Build Coastguard Worker void fromLinearSrgb(const void* color) override { SK_ABORT("unsupported RP callback"); }
933*c8dee2aaSAndroid Build Coastguard Worker
934*c8dee2aaSAndroid Build Coastguard Worker SkRasterPipeline* fPipeline = nullptr;
935*c8dee2aaSAndroid Build Coastguard Worker SkArenaAlloc* fAlloc = nullptr;
936*c8dee2aaSAndroid Build Coastguard Worker const TArray<std::string_view>* fChildEffects;
937*c8dee2aaSAndroid Build Coastguard Worker };
938*c8dee2aaSAndroid Build Coastguard Worker
939*c8dee2aaSAndroid Build Coastguard Worker RPCallbacks callbacks{&pipeline, &alloc, &childEffects};
940*c8dee2aaSAndroid Build Coastguard Worker
941*c8dee2aaSAndroid Build Coastguard Worker // Append the SkSL program to the raster pipeline.
942*c8dee2aaSAndroid Build Coastguard Worker pipeline.appendConstantColor(&alloc, SkColors::kTransparent);
943*c8dee2aaSAndroid Build Coastguard Worker rasterProg->appendStages(&pipeline, &alloc, &callbacks, SkSpan(uniformValues));
944*c8dee2aaSAndroid Build Coastguard Worker
945*c8dee2aaSAndroid Build Coastguard Worker // Move the float values from RGBA into an 8888 memory buffer.
946*c8dee2aaSAndroid Build Coastguard Worker uint32_t out[SkRasterPipeline_kMaxStride_highp] = {};
947*c8dee2aaSAndroid Build Coastguard Worker SkRasterPipeline_MemoryCtx outCtx{/*pixels=*/out, /*stride=*/SkRasterPipeline_kMaxStride_highp};
948*c8dee2aaSAndroid Build Coastguard Worker pipeline.append(SkRasterPipelineOp::store_8888, &outCtx);
949*c8dee2aaSAndroid Build Coastguard Worker pipeline.run(0, 0, 1, 1);
950*c8dee2aaSAndroid Build Coastguard Worker
951*c8dee2aaSAndroid Build Coastguard Worker // Make sure the first pixel (exclusively) of `out` is green. If the program compiled
952*c8dee2aaSAndroid Build Coastguard Worker // successfully, we expect it to run without error, and will assert if it doesn't.
953*c8dee2aaSAndroid Build Coastguard Worker uint32_t expected = 0xFF00FF00;
954*c8dee2aaSAndroid Build Coastguard Worker if (out[0] != expected) {
955*c8dee2aaSAndroid Build Coastguard Worker ERRORF(r, "%s: Raster Pipeline failed. Expected solid green, got ARGB:%02X%02X%02X%02X",
956*c8dee2aaSAndroid Build Coastguard Worker testFile,
957*c8dee2aaSAndroid Build Coastguard Worker (out[0] >> 24) & 0xFF,
958*c8dee2aaSAndroid Build Coastguard Worker (out[0] >> 16) & 0xFF,
959*c8dee2aaSAndroid Build Coastguard Worker (out[0] >> 8) & 0xFF,
960*c8dee2aaSAndroid Build Coastguard Worker out[0] & 0xFF);
961*c8dee2aaSAndroid Build Coastguard Worker return;
962*c8dee2aaSAndroid Build Coastguard Worker }
963*c8dee2aaSAndroid Build Coastguard Worker
964*c8dee2aaSAndroid Build Coastguard Worker // Success!
965*c8dee2aaSAndroid Build Coastguard Worker report_rp_pass(r, testFile, flags);
966*c8dee2aaSAndroid Build Coastguard Worker }
967*c8dee2aaSAndroid Build Coastguard Worker
968*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GANESH)
969*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_SKSL_TEST(flags, ctsEnforcement, name, path) \
970*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GANESH_TEST_FOR_RENDERING_CONTEXTS(SkSL##name##_Ganesh, \
971*c8dee2aaSAndroid Build Coastguard Worker r, \
972*c8dee2aaSAndroid Build Coastguard Worker ctxInfo, \
973*c8dee2aaSAndroid Build Coastguard Worker is_gpu(flags), \
974*c8dee2aaSAndroid Build Coastguard Worker ctsEnforcement) { \
975*c8dee2aaSAndroid Build Coastguard Worker test_ganesh(r, ctxInfo, #name, path, flags); \
976*c8dee2aaSAndroid Build Coastguard Worker }
977*c8dee2aaSAndroid Build Coastguard Worker #else
978*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GANESH_SKSL_TEST(flags, ctsEnforcement, name, path) /* Ganesh is disabled */
979*c8dee2aaSAndroid Build Coastguard Worker #endif
980*c8dee2aaSAndroid Build Coastguard Worker
981*c8dee2aaSAndroid Build Coastguard Worker #if defined(SK_GRAPHITE)
is_native_context_or_dawn(skgpu::ContextType type)982*c8dee2aaSAndroid Build Coastguard Worker static bool is_native_context_or_dawn(skgpu::ContextType type) {
983*c8dee2aaSAndroid Build Coastguard Worker return skgpu::IsNativeBackend(type) || skgpu::IsDawnBackend(type);
984*c8dee2aaSAndroid Build Coastguard Worker }
985*c8dee2aaSAndroid Build Coastguard Worker
986*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_SKSL_TEST(flags, ctsEnforcement, name, path) \
987*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_GRAPHITE_TEST_FOR_CONTEXTS(SkSL##name##_Graphite, \
988*c8dee2aaSAndroid Build Coastguard Worker is_native_context_or_dawn, \
989*c8dee2aaSAndroid Build Coastguard Worker r, \
990*c8dee2aaSAndroid Build Coastguard Worker context, \
991*c8dee2aaSAndroid Build Coastguard Worker testContext, \
992*c8dee2aaSAndroid Build Coastguard Worker /*opt_filter=*/nullptr, \
993*c8dee2aaSAndroid Build Coastguard Worker is_gpu(flags), \
994*c8dee2aaSAndroid Build Coastguard Worker ctsEnforcement) { \
995*c8dee2aaSAndroid Build Coastguard Worker test_graphite(r, context, testContext, #name, path, flags); \
996*c8dee2aaSAndroid Build Coastguard Worker }
997*c8dee2aaSAndroid Build Coastguard Worker #else
998*c8dee2aaSAndroid Build Coastguard Worker #define DEF_GRAPHITE_SKSL_TEST(flags, ctsEnforcement, name, path) /* Graphite is disabled */
999*c8dee2aaSAndroid Build Coastguard Worker #endif
1000*c8dee2aaSAndroid Build Coastguard Worker
1001*c8dee2aaSAndroid Build Coastguard Worker #define SKSL_TEST(flags, ctsEnforcement, name, path) \
1002*c8dee2aaSAndroid Build Coastguard Worker DEF_CONDITIONAL_TEST(SkSL##name##_CPU, r, is_cpu(flags)) { test_cpu(r, #name, path, flags); } \
1003*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSL##name##_RP, r) { test_raster_pipeline(r, path, flags); } \
1004*c8dee2aaSAndroid Build Coastguard Worker DEF_TEST(SkSL##name##_Clone, r) { test_clone(r, path, flags); } \
1005*c8dee2aaSAndroid Build Coastguard Worker DEF_GANESH_SKSL_TEST(flags, ctsEnforcement, name, path) \
1006*c8dee2aaSAndroid Build Coastguard Worker DEF_GRAPHITE_SKSL_TEST(flags, std::max(kApiLevel_V, ctsEnforcement), name, path)
1007*c8dee2aaSAndroid Build Coastguard Worker
1008*c8dee2aaSAndroid Build Coastguard Worker /**
1009*c8dee2aaSAndroid Build Coastguard Worker * Test flags:
1010*c8dee2aaSAndroid Build Coastguard Worker * - CPU: this test should pass on the CPU backend
1011*c8dee2aaSAndroid Build Coastguard Worker * - GPU: this test should pass on the Ganesh GPU backends
1012*c8dee2aaSAndroid Build Coastguard Worker * - GPU_ES3: this test should pass on an ES3-compatible GPU when "enforce ES2 restrictions" is off
1013*c8dee2aaSAndroid Build Coastguard Worker *
1014*c8dee2aaSAndroid Build Coastguard Worker * CtsEnforcement:
1015*c8dee2aaSAndroid Build Coastguard Worker * Android CTS (go/wtf/cts) enforces that devices must pass this test at the given API level.
1016*c8dee2aaSAndroid Build Coastguard Worker * CTS and Android SkQP builds should only run tests on devices greater than the provided API
1017*c8dee2aaSAndroid Build Coastguard Worker * level, but other test binaries (dm/fm) should run every test, regardless of this value.
1018*c8dee2aaSAndroid Build Coastguard Worker */
1019*c8dee2aaSAndroid Build Coastguard Worker
1020*c8dee2aaSAndroid Build Coastguard Worker // clang-format off
1021*c8dee2aaSAndroid Build Coastguard Worker
1022*c8dee2aaSAndroid Build Coastguard Worker constexpr SkSLTestFlags CPU = SkSLTestFlag::CPU;
1023*c8dee2aaSAndroid Build Coastguard Worker constexpr SkSLTestFlags ES3 = SkSLTestFlag::ES3;
1024*c8dee2aaSAndroid Build Coastguard Worker constexpr SkSLTestFlags GPU = SkSLTestFlag::GPU;
1025*c8dee2aaSAndroid Build Coastguard Worker constexpr SkSLTestFlags GPU_ES3 = SkSLTestFlag::GPU_ES3;
1026*c8dee2aaSAndroid Build Coastguard Worker constexpr SkSLTestFlags UsesNaN = SkSLTestFlag::UsesNaN;
1027*c8dee2aaSAndroid Build Coastguard Worker constexpr SkSLTestFlags Priv = SkSLTestFlag::Priv;
1028*c8dee2aaSAndroid Build Coastguard Worker constexpr auto kApiLevel_T = CtsEnforcement::kApiLevel_T;
1029*c8dee2aaSAndroid Build Coastguard Worker constexpr auto kApiLevel_U = CtsEnforcement::kApiLevel_U;
1030*c8dee2aaSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto kApiLevel_V = CtsEnforcement::kApiLevel_V;
1031*c8dee2aaSAndroid Build Coastguard Worker constexpr auto kNever = CtsEnforcement::kNever;
1032*c8dee2aaSAndroid Build Coastguard Worker [[maybe_unused]] constexpr auto kNextRelease = CtsEnforcement::kNextRelease;
1033*c8dee2aaSAndroid Build Coastguard Worker
1034*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kApiLevel_T, ArrayFolding, "folding/ArrayFolding.sksl")
1035*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ArraySizeFolding, "folding/ArraySizeFolding.rts")
1036*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, AssignmentOps, "folding/AssignmentOps.rts")
1037*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, BoolFolding, "folding/BoolFolding.rts")
1038*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, CastFolding, "folding/CastFolding.rts")
1039*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntFoldingES2, "folding/IntFoldingES2.rts")
1040*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntFoldingES3, "folding/IntFoldingES3.sksl")
1041*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, FloatFolding, "folding/FloatFolding.rts")
1042*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, LogicalNot, "folding/LogicalNot.rts")
1043*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, MatrixFoldingES2, "folding/MatrixFoldingES2.rts")
1044*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, MatrixFoldingES3, "folding/MatrixFoldingES3.sksl")
1045*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, MatrixNoOpFolding, "folding/MatrixNoOpFolding.rts")
1046*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, MatrixScalarNoOpFolding, "folding/MatrixScalarNoOpFolding.rts")
1047*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, MatrixVectorNoOpFolding, "folding/MatrixVectorNoOpFolding.rts")
1048*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, Negation, "folding/Negation.rts")
1049*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, PreserveSideEffects, "folding/PreserveSideEffects.rts")
1050*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SelfAssignment, "folding/SelfAssignment.rts")
1051*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ShortCircuitBoolFolding, "folding/ShortCircuitBoolFolding.rts")
1052*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, StructFieldFolding, "folding/StructFieldFolding.rts")
1053*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, StructFieldNoFolding, "folding/StructFieldNoFolding.rts")
1054*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwitchCaseFolding, "folding/SwitchCaseFolding.rts")
1055*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleFolding, "folding/SwizzleFolding.rts")
1056*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, TernaryFolding, "folding/TernaryFolding.rts")
1057*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, VectorScalarFolding, "folding/VectorScalarFolding.rts")
1058*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, VectorVectorFolding, "folding/VectorVectorFolding.rts")
1059*c8dee2aaSAndroid Build Coastguard Worker
1060*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, CommaExpressionsAllowInlining, "inliner/CommaExpressionsAllowInlining.sksl")
1061*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, DoWhileBodyMustBeInlinedIntoAScope, "inliner/DoWhileBodyMustBeInlinedIntoAScope.sksl")
1062*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, DoWhileTestCannotBeInlined, "inliner/DoWhileTestCannotBeInlined.sksl")
1063*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ForBodyMustBeInlinedIntoAScope, "inliner/ForBodyMustBeInlinedIntoAScope.sksl")
1064*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ForInitializerExpressionsCanBeInlined, "inliner/ForInitializerExpressionsCanBeInlined.sksl")
1065*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ForWithoutReturnInsideCanBeInlined, "inliner/ForWithoutReturnInsideCanBeInlined.sksl")
1066*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ForWithReturnInsideCannotBeInlined, "inliner/ForWithReturnInsideCannotBeInlined.sksl")
1067*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IfBodyMustBeInlinedIntoAScope, "inliner/IfBodyMustBeInlinedIntoAScope.sksl")
1068*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IfElseBodyMustBeInlinedIntoAScope, "inliner/IfElseBodyMustBeInlinedIntoAScope.sksl")
1069*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IfElseChainWithReturnsCanBeInlined, "inliner/IfElseChainWithReturnsCanBeInlined.sksl")
1070*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IfTestCanBeInlined, "inliner/IfTestCanBeInlined.sksl")
1071*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IfWithReturnsCanBeInlined, "inliner/IfWithReturnsCanBeInlined.sksl")
1072*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlineKeywordOverridesThreshold, "inliner/InlineKeywordOverridesThreshold.sksl")
1073*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlinerAvoidsVariableNameOverlap, "inliner/InlinerAvoidsVariableNameOverlap.sksl")
1074*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlinerElidesTempVarForReturnsInsideBlock, "inliner/InlinerElidesTempVarForReturnsInsideBlock.sksl")
1075*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlinerUsesTempVarForMultipleReturns, "inliner/InlinerUsesTempVarForMultipleReturns.sksl")
1076*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlinerUsesTempVarForReturnsInsideBlockWithVar, "inliner/InlinerUsesTempVarForReturnsInsideBlockWithVar.sksl")
1077*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlineThreshold, "inliner/InlineThreshold.sksl")
1078*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kApiLevel_U, InlineUnscopedVariable, "inliner/InlineUnscopedVariable.sksl")
1079*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlineWithModifiedArgument, "inliner/InlineWithModifiedArgument.sksl")
1080*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlineWithNestedBigCalls, "inliner/InlineWithNestedBigCalls.sksl")
1081*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlineWithUnmodifiedArgument, "inliner/InlineWithUnmodifiedArgument.sksl")
1082*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InlineWithUnnecessaryBlocks, "inliner/InlineWithUnnecessaryBlocks.sksl")
1083*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, IntrinsicNameCollision, "inliner/IntrinsicNameCollision.sksl")
1084*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, ModifiedArrayParametersCannotBeInlined, "inliner/ModifiedArrayParametersCannotBeInlined.sksl")
1085*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, ModifiedStructParametersCannotBeInlined, "inliner/ModifiedStructParametersCannotBeInlined.sksl")
1086*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, NoInline, "inliner/NoInline.sksl")
1087*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ShortCircuitEvaluationsCannotInlineRightHandSide, "inliner/ShortCircuitEvaluationsCannotInlineRightHandSide.sksl")
1088*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, StaticSwitchInline, "inliner/StaticSwitch.sksl")
1089*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, StructsCanBeInlinedSafely, "inliner/StructsCanBeInlinedSafely.sksl")
1090*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleCanBeInlinedDirectly, "inliner/SwizzleCanBeInlinedDirectly.sksl")
1091*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, TernaryResultsCannotBeInlined, "inliner/TernaryResultsCannotBeInlined.sksl")
1092*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, TernaryTestCanBeInlined, "inliner/TernaryTestCanBeInlined.sksl")
1093*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, TrivialArgumentsInlineDirectly, "inliner/TrivialArgumentsInlineDirectly.sksl")
1094*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, TrivialArgumentsInlineDirectlyES3, "inliner/TrivialArgumentsInlineDirectlyES3.sksl")
1095*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, TypeShadowing, "inliner/TypeShadowing.sksl")
1096*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, WhileBodyMustBeInlinedIntoAScope, "inliner/WhileBodyMustBeInlinedIntoAScope.sksl")
1097*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, WhileTestCannotBeInlined, "inliner/WhileTestCannotBeInlined.sksl")
1098*c8dee2aaSAndroid Build Coastguard Worker
1099*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicAbsFloat, "intrinsics/AbsFloat.sksl")
1100*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicAbsInt, "intrinsics/AbsInt.sksl")
1101*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicAny, "intrinsics/Any.sksl")
1102*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicAll, "intrinsics/All.sksl")
1103*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicCeil, "intrinsics/Ceil.sksl")
1104*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicClampInt, "intrinsics/ClampInt.sksl")
1105*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicClampUInt, "intrinsics/ClampUInt.sksl")
1106*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicClampFloat, "intrinsics/ClampFloat.sksl")
1107*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicCross, "intrinsics/Cross.sksl")
1108*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicDegrees, "intrinsics/Degrees.sksl")
1109*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicDeterminant, "intrinsics/Determinant.sksl")
1110*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicDFdx, "intrinsics/DFdx.sksl")
1111*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicDFdy, "intrinsics/DFdy.sksl")
1112*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicDot, "intrinsics/Dot.sksl")
1113*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicFract, "intrinsics/Fract.sksl")
1114*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicFloatBitsToInt, "intrinsics/FloatBitsToInt.sksl")
1115*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicFloatBitsToUint, "intrinsics/FloatBitsToUint.sksl")
1116*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicFloor, "intrinsics/Floor.sksl")
1117*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicFwidth, "intrinsics/Fwidth.sksl")
1118*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicIntBitsToFloat, "intrinsics/IntBitsToFloat.sksl")
1119*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicIsInf, "intrinsics/IsInf.sksl")
1120*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicLength, "intrinsics/Length.sksl")
1121*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicMatrixCompMultES2, "intrinsics/MatrixCompMultES2.sksl")
1122*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicMatrixCompMultES3, "intrinsics/MatrixCompMultES3.sksl")
1123*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicMaxFloat, "intrinsics/MaxFloat.sksl")
1124*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicMaxInt, "intrinsics/MaxInt.sksl")
1125*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicMaxUint, "intrinsics/MaxUint.sksl")
1126*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicMinFloat, "intrinsics/MinFloat.sksl")
1127*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicMinInt, "intrinsics/MinInt.sksl")
1128*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicMinUint, "intrinsics/MinUint.sksl")
1129*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicMixFloatES2, "intrinsics/MixFloatES2.sksl")
1130*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicMixFloatES3, "intrinsics/MixFloatES3.sksl")
1131*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicModf, "intrinsics/Modf.sksl")
1132*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicNot, "intrinsics/Not.sksl")
1133*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicOuterProduct, "intrinsics/OuterProduct.sksl")
1134*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicRadians, "intrinsics/Radians.sksl")
1135*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicRound, "intrinsics/Round.sksl")
1136*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, IntrinsicRoundEven, "intrinsics/RoundEven.sksl")
1137*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicSaturate, "intrinsics/Saturate.sksl")
1138*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicSignFloat, "intrinsics/SignFloat.sksl")
1139*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicSignInt, "intrinsics/SignInt.sksl")
1140*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, IntrinsicSqrt, "intrinsics/Sqrt.sksl")
1141*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, IntrinsicStep, "intrinsics/Step.sksl")
1142*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicTrunc, "intrinsics/Trunc.sksl")
1143*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicTranspose, "intrinsics/Transpose.sksl")
1144*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, IntrinsicUintBitsToFloat, "intrinsics/UintBitsToFloat.sksl")
1145*c8dee2aaSAndroid Build Coastguard Worker
1146*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ArrayNarrowingConversions, "runtime/ArrayNarrowingConversions.rts")
1147*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNextRelease,ChildEffectSimple, "runtime/ChildEffectSimple.rts")
1148*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU|Priv,kNextRelease,ChildEffectSpecializationFanOut, "runtime/ChildEffectSpecializationFanOut.privrts")
1149*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, Commutative, "runtime/Commutative.rts")
1150*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU, kNever, DivideByZero, "runtime/DivideByZero.rts")
1151*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, FunctionParameterAliasingFirst, "runtime/FunctionParameterAliasingFirst.rts")
1152*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, FunctionParameterAliasingSecond, "runtime/FunctionParameterAliasingSecond.rts")
1153*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, IfElseBinding, "runtime/IfElseBinding.rts")
1154*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, IncrementDisambiguation, "runtime/IncrementDisambiguation.rts")
1155*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, LoopFloat, "runtime/LoopFloat.rts")
1156*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, LoopInt, "runtime/LoopInt.rts")
1157*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, Ossfuzz52603, "runtime/Ossfuzz52603.rts")
1158*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, QualifierOrder, "runtime/QualifierOrder.rts")
1159*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, PrecisionQualifiers, "runtime/PrecisionQualifiers.rts")
1160*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNextRelease,SharedFunctions, "runtime/SharedFunctions.rts")
1161*c8dee2aaSAndroid Build Coastguard Worker
1162*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3 | UsesNaN, kNever, RecursiveComparison_Arrays, "runtime/RecursiveComparison_Arrays.rts")
1163*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3 | UsesNaN, kNever, RecursiveComparison_Structs, "runtime/RecursiveComparison_Structs.rts")
1164*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3 | UsesNaN, kNever, RecursiveComparison_Types, "runtime/RecursiveComparison_Types.rts")
1165*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3 | UsesNaN, kNever, RecursiveComparison_Vectors, "runtime/RecursiveComparison_Vectors.rts")
1166*c8dee2aaSAndroid Build Coastguard Worker
1167*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ArrayCast, "shared/ArrayCast.sksl")
1168*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ArrayComparison, "shared/ArrayComparison.sksl")
1169*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ArrayConstructors, "shared/ArrayConstructors.sksl")
1170*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, ArrayFollowedByScalar, "shared/ArrayFollowedByScalar.sksl")
1171*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ArrayTypes, "shared/ArrayTypes.sksl")
1172*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, Assignment, "shared/Assignment.sksl")
1173*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, CastsRoundTowardZero, "shared/CastsRoundTowardZero.sksl")
1174*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, CommaMixedTypes, "shared/CommaMixedTypes.sksl")
1175*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, CommaSideEffects, "shared/CommaSideEffects.sksl")
1176*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, CompileTimeConstantVariables, "shared/CompileTimeConstantVariables.sksl")
1177*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ConstantCompositeAccessViaConstantIndex, "shared/ConstantCompositeAccessViaConstantIndex.sksl")
1178*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ConstantCompositeAccessViaDynamicIndex, "shared/ConstantCompositeAccessViaDynamicIndex.sksl")
1179*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ConstantIf, "shared/ConstantIf.sksl")
1180*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ConstArray, "shared/ConstArray.sksl")
1181*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ConstVariableComparison, "shared/ConstVariableComparison.sksl")
1182*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, DeadGlobals, "shared/DeadGlobals.sksl")
1183*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, DeadLoopVariable, "shared/DeadLoopVariable.sksl")
1184*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, DeadIfStatement, "shared/DeadIfStatement.sksl")
1185*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, DeadReturn, "shared/DeadReturn.sksl")
1186*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, DeadReturnES3, "shared/DeadReturnES3.sksl")
1187*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, DeadStripFunctions, "shared/DeadStripFunctions.sksl")
1188*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, DependentInitializers, "shared/DependentInitializers.sksl")
1189*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, DoubleNegation, "shared/DoubleNegation.sksl")
1190*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, DoWhileControlFlow, "shared/DoWhileControlFlow.sksl")
1191*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, EmptyBlocksES2, "shared/EmptyBlocksES2.sksl")
1192*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, EmptyBlocksES3, "shared/EmptyBlocksES3.sksl")
1193*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ForLoopControlFlow, "shared/ForLoopControlFlow.sksl")
1194*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ForLoopMultipleInitES3, "shared/ForLoopMultipleInitES3.sksl")
1195*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, ForLoopShadowing, "shared/ForLoopShadowing.sksl")
1196*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, FunctionAnonymousParameters, "shared/FunctionAnonymousParameters.sksl")
1197*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, FunctionArgTypeMatch, "shared/FunctionArgTypeMatch.sksl")
1198*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, FunctionReturnTypeMatch, "shared/FunctionReturnTypeMatch.sksl")
1199*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, Functions, "shared/Functions.sksl")
1200*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, FunctionPrototype, "shared/FunctionPrototype.sksl")
1201*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, GeometricIntrinsics, "shared/GeometricIntrinsics.sksl")
1202*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, HelloWorld, "shared/HelloWorld.sksl")
1203*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, Hex, "shared/Hex.sksl")
1204*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, HexUnsigned, "shared/HexUnsigned.sksl")
1205*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, IfStatement, "shared/IfStatement.sksl")
1206*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, InoutParameters, "shared/InoutParameters.sksl")
1207*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, InoutParamsAreDistinct, "shared/InoutParamsAreDistinct.sksl")
1208*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kApiLevel_U, IntegerDivisionES3, "shared/IntegerDivisionES3.sksl")
1209*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, LogicalAndShortCircuit, "shared/LogicalAndShortCircuit.sksl")
1210*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, LogicalOrShortCircuit, "shared/LogicalOrShortCircuit.sksl")
1211*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, Matrices, "shared/Matrices.sksl")
1212*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, MatricesNonsquare, "shared/MatricesNonsquare.sksl")
1213*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, MatrixConstructorsES2, "shared/MatrixConstructorsES2.sksl")
1214*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, MatrixConstructorsES3, "shared/MatrixConstructorsES3.sksl")
1215*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, MatrixEquality, "shared/MatrixEquality.sksl")
1216*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, MatrixIndexLookup, "shared/MatrixIndexLookup.sksl")
1217*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, MatrixIndexStore, "shared/MatrixIndexStore.sksl")
1218*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, MatrixOpEqualsES2, "shared/MatrixOpEqualsES2.sksl")
1219*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kApiLevel_U, MatrixOpEqualsES3, "shared/MatrixOpEqualsES3.sksl")
1220*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, MatrixScalarMath, "shared/MatrixScalarMath.sksl")
1221*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, MatrixSwizzleStore, "shared/MatrixSwizzleStore.sksl")
1222*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, MatrixToVectorCast, "shared/MatrixToVectorCast.sksl")
1223*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, MultipleAssignments, "shared/MultipleAssignments.sksl")
1224*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, NumberCasts, "shared/NumberCasts.sksl")
1225*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, NestedComparisonIntrinsics, "shared/NestedComparisonIntrinsics.sksl")
1226*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, OperatorsES2, "shared/OperatorsES2.sksl")
1227*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(GPU_ES3, kNever, OperatorsES3, "shared/OperatorsES3.sksl")
1228*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, Ossfuzz36852, "shared/Ossfuzz36852.sksl")
1229*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, OutParams, "shared/OutParams.sksl")
1230*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, OutParamsAreDistinct, "shared/OutParamsAreDistinct.sksl")
1231*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, OutParamsAreDistinctFromGlobal, "shared/OutParamsAreDistinctFromGlobal.sksl")
1232*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, OutParamsFunctionCallInArgument, "shared/OutParamsFunctionCallInArgument.sksl")
1233*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, OutParamsDoubleSwizzle, "shared/OutParamsDoubleSwizzle.sksl")
1234*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, PostfixExpressions, "shared/PostfixExpressions.sksl")
1235*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, PrefixExpressionsES2, "shared/PrefixExpressionsES2.sksl")
1236*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, PrefixExpressionsES3, "shared/PrefixExpressionsES3.sksl")
1237*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNextRelease,ReservedInGLSLButAllowedInSkSL, "shared/ReservedInGLSLButAllowedInSkSL.sksl")
1238*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ResizeMatrix, "shared/ResizeMatrix.sksl")
1239*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ResizeMatrixNonsquare, "shared/ResizeMatrixNonsquare.sksl")
1240*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ReturnsValueOnEveryPathES2, "shared/ReturnsValueOnEveryPathES2.sksl")
1241*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ReturnsValueOnEveryPathES3, "shared/ReturnsValueOnEveryPathES3.sksl")
1242*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ScalarConversionConstructorsES2, "shared/ScalarConversionConstructorsES2.sksl")
1243*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, ScalarConversionConstructorsES3, "shared/ScalarConversionConstructorsES3.sksl")
1244*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, ScopedSymbol, "shared/ScopedSymbol.sksl")
1245*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, StackingVectorCasts, "shared/StackingVectorCasts.sksl")
1246*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU_ES3, kNever, StaticSwitch, "shared/StaticSwitch.sksl")
1247*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, StructArrayFollowedByScalar, "shared/StructArrayFollowedByScalar.sksl")
1248*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, StructIndexLookup, "shared/StructIndexLookup.sksl")
1249*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, StructIndexStore, "shared/StructIndexStore.sksl")
1250*c8dee2aaSAndroid Build Coastguard Worker // TODO(skia:13920): StructComparison currently exposes a bug in SPIR-V codegen.
1251*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3, kNextRelease,StructComparison, "shared/StructComparison.sksl")
1252*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, StructsInFunctions, "shared/StructsInFunctions.sksl")
1253*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, Switch, "shared/Switch.sksl")
1254*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwitchDefaultOnly, "shared/SwitchDefaultOnly.sksl")
1255*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwitchWithFallthrough, "shared/SwitchWithFallthrough.sksl")
1256*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwitchWithFallthroughAndVarDecls,"shared/SwitchWithFallthroughAndVarDecls.sksl")
1257*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, SwitchWithFallthroughGroups, "shared/SwitchWithFallthroughGroups.sksl")
1258*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwitchWithLoops, "shared/SwitchWithLoops.sksl")
1259*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, SwitchWithLoopsES3, "shared/SwitchWithLoopsES3.sksl")
1260*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kNever, SwizzleAsLValue, "shared/SwizzleAsLValue.sksl")
1261*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, SwizzleAsLValueES3, "shared/SwizzleAsLValueES3.sksl")
1262*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleBoolConstants, "shared/SwizzleBoolConstants.sksl")
1263*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleByConstantIndex, "shared/SwizzleByConstantIndex.sksl")
1264*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, SwizzleByIndex, "shared/SwizzleByIndex.sksl")
1265*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleConstants, "shared/SwizzleConstants.sksl")
1266*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, SwizzleIndexLookup, "shared/SwizzleIndexLookup.sksl")
1267*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, SwizzleIndexStore, "shared/SwizzleIndexStore.sksl")
1268*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleLTRB, "shared/SwizzleLTRB.sksl")
1269*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleOpt, "shared/SwizzleOpt.sksl")
1270*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleScalar, "shared/SwizzleScalar.sksl")
1271*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleScalarBool, "shared/SwizzleScalarBool.sksl")
1272*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, SwizzleScalarInt, "shared/SwizzleScalarInt.sksl")
1273*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, TemporaryIndexLookup, "shared/TemporaryIndexLookup.sksl")
1274*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, TernaryAsLValueEntirelyFoldable, "shared/TernaryAsLValueEntirelyFoldable.sksl")
1275*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, TernaryAsLValueFoldableTest, "shared/TernaryAsLValueFoldableTest.sksl")
1276*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, TernaryComplexNesting, "shared/TernaryComplexNesting.sksl")
1277*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, TernaryExpression, "shared/TernaryExpression.sksl")
1278*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, TernaryNesting, "shared/TernaryNesting.sksl")
1279*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, TernaryOneZeroOptimization, "shared/TernaryOneZeroOptimization.sksl")
1280*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, TernarySideEffects, "shared/TernarySideEffects.sksl")
1281*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, UnaryPositiveNegative, "shared/UnaryPositiveNegative.sksl")
1282*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, UniformArray, "shared/UniformArray.sksl")
1283*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_U, UniformMatrixResize, "shared/UniformMatrixResize.sksl")
1284*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, UnusedVariables, "shared/UnusedVariables.sksl")
1285*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, VectorConstructors, "shared/VectorConstructors.sksl")
1286*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, VectorToMatrixCast, "shared/VectorToMatrixCast.sksl")
1287*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_T, VectorScalarMath, "shared/VectorScalarMath.sksl")
1288*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(ES3 | GPU_ES3, kNever, WhileLoopControlFlow, "shared/WhileLoopControlFlow.sksl")
1289*c8dee2aaSAndroid Build Coastguard Worker
1290*c8dee2aaSAndroid Build Coastguard Worker SKSL_TEST(CPU | GPU, kApiLevel_V, VoidInSequenceExpressions, "workarounds/VoidInSequenceExpressions.sksl")
1291