1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2019 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci#include "bench/Benchmark.h" 8cb93a386Sopenharmony_ci#include "bench/ResultsWriter.h" 9cb93a386Sopenharmony_ci#include "bench/SkSLBench.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "src/gpu/GrCaps.h" 12cb93a386Sopenharmony_ci#include "src/gpu/GrRecordingContextPriv.h" 13cb93a386Sopenharmony_ci#include "src/gpu/mock/GrMockCaps.h" 14cb93a386Sopenharmony_ci#include "src/sksl/SkSLCompiler.h" 15cb93a386Sopenharmony_ci#include "src/sksl/SkSLDSLParser.h" 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_ciclass SkSLCompilerStartupBench : public Benchmark { 18cb93a386Sopenharmony_ciprotected: 19cb93a386Sopenharmony_ci const char* onGetName() override { 20cb93a386Sopenharmony_ci return "sksl_compiler_startup"; 21cb93a386Sopenharmony_ci } 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 24cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 25cb93a386Sopenharmony_ci } 26cb93a386Sopenharmony_ci 27cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas*) override { 28cb93a386Sopenharmony_ci GrShaderCaps caps; 29cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 30cb93a386Sopenharmony_ci SkSL::Compiler compiler(&caps); 31cb93a386Sopenharmony_ci } 32cb93a386Sopenharmony_ci } 33cb93a386Sopenharmony_ci}; 34cb93a386Sopenharmony_ci 35cb93a386Sopenharmony_ciDEF_BENCH(return new SkSLCompilerStartupBench();) 36cb93a386Sopenharmony_ci 37cb93a386Sopenharmony_cienum class Output { 38cb93a386Sopenharmony_ci kNone, 39cb93a386Sopenharmony_ci kGLSL, 40cb93a386Sopenharmony_ci kMetal, 41cb93a386Sopenharmony_ci kSPIRV 42cb93a386Sopenharmony_ci}; 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ciclass SkSLCompileBench : public Benchmark { 45cb93a386Sopenharmony_cipublic: 46cb93a386Sopenharmony_ci static const char* output_string(Output output) { 47cb93a386Sopenharmony_ci switch (output) { 48cb93a386Sopenharmony_ci case Output::kNone: return ""; 49cb93a386Sopenharmony_ci case Output::kGLSL: return "glsl_"; 50cb93a386Sopenharmony_ci case Output::kMetal: return "metal_"; 51cb93a386Sopenharmony_ci case Output::kSPIRV: return "spirv_"; 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci SkUNREACHABLE; 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci 56cb93a386Sopenharmony_ci SkSLCompileBench(SkSL::String name, const char* src, bool optimize, Output output) 57cb93a386Sopenharmony_ci : fName(SkSL::String("sksl_") + (optimize ? "" : "unoptimized_") + output_string(output) + 58cb93a386Sopenharmony_ci name) 59cb93a386Sopenharmony_ci , fSrc(src) 60cb93a386Sopenharmony_ci , fCaps(GrContextOptions(), GrMockOptions()) 61cb93a386Sopenharmony_ci , fCompiler(fCaps.shaderCaps()) 62cb93a386Sopenharmony_ci , fOutput(output) { 63cb93a386Sopenharmony_ci fSettings.fOptimize = optimize; 64cb93a386Sopenharmony_ci fSettings.fDSLMangling = false; 65cb93a386Sopenharmony_ci // The test programs we compile don't follow Vulkan rules and thus produce invalid 66cb93a386Sopenharmony_ci // SPIR-V. This is harmless, so long as we don't try to validate them. 67cb93a386Sopenharmony_ci fSettings.fValidateSPIRV = false; 68cb93a386Sopenharmony_ci } 69cb93a386Sopenharmony_ci 70cb93a386Sopenharmony_ciprotected: 71cb93a386Sopenharmony_ci const char* onGetName() override { 72cb93a386Sopenharmony_ci return fName.c_str(); 73cb93a386Sopenharmony_ci } 74cb93a386Sopenharmony_ci 75cb93a386Sopenharmony_ci bool isSuitableFor(Backend backend) override { 76cb93a386Sopenharmony_ci return backend == kNonRendering_Backend; 77cb93a386Sopenharmony_ci } 78cb93a386Sopenharmony_ci 79cb93a386Sopenharmony_ci void onDraw(int loops, SkCanvas* canvas) override { 80cb93a386Sopenharmony_ci for (int i = 0; i < loops; i++) { 81cb93a386Sopenharmony_ci std::unique_ptr<SkSL::Program> program = SkSL::DSLParser(&fCompiler, 82cb93a386Sopenharmony_ci fSettings, 83cb93a386Sopenharmony_ci SkSL::ProgramKind::kFragment, 84cb93a386Sopenharmony_ci fSrc).program(); 85cb93a386Sopenharmony_ci if (fCompiler.errorCount()) { 86cb93a386Sopenharmony_ci SK_ABORT("shader compilation failed: %s\n", fCompiler.errorText().c_str()); 87cb93a386Sopenharmony_ci } 88cb93a386Sopenharmony_ci SkSL::String result; 89cb93a386Sopenharmony_ci switch (fOutput) { 90cb93a386Sopenharmony_ci case Output::kNone: break; 91cb93a386Sopenharmony_ci case Output::kGLSL: SkAssertResult(fCompiler.toGLSL(*program, &result)); break; 92cb93a386Sopenharmony_ci case Output::kMetal: SkAssertResult(fCompiler.toMetal(*program, &result)); break; 93cb93a386Sopenharmony_ci case Output::kSPIRV: SkAssertResult(fCompiler.toSPIRV(*program, &result)); break; 94cb93a386Sopenharmony_ci } 95cb93a386Sopenharmony_ci } 96cb93a386Sopenharmony_ci } 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ciprivate: 99cb93a386Sopenharmony_ci SkSL::String fName; 100cb93a386Sopenharmony_ci SkSL::String fSrc; 101cb93a386Sopenharmony_ci GrMockCaps fCaps; 102cb93a386Sopenharmony_ci SkSL::Compiler fCompiler; 103cb93a386Sopenharmony_ci SkSL::Program::Settings fSettings; 104cb93a386Sopenharmony_ci Output fOutput; 105cb93a386Sopenharmony_ci 106cb93a386Sopenharmony_ci using INHERITED = Benchmark; 107cb93a386Sopenharmony_ci}; 108cb93a386Sopenharmony_ci 109cb93a386Sopenharmony_ci/////////////////////////////////////////////////////////////////////////////// 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_ci#define COMPILER_BENCH(name, text) \ 112cb93a386Sopenharmony_cistatic constexpr char name ## _SRC[] = text; \ 113cb93a386Sopenharmony_ciDEF_BENCH(return new SkSLCompileBench(#name, name ## _SRC, /*optimize=*/false, Output::kNone);) \ 114cb93a386Sopenharmony_ciDEF_BENCH(return new SkSLCompileBench(#name, name ## _SRC, /*optimize=*/true, Output::kNone);) \ 115cb93a386Sopenharmony_ciDEF_BENCH(return new SkSLCompileBench(#name, name ## _SRC, /*optimize=*/true, Output::kGLSL);) \ 116cb93a386Sopenharmony_ciDEF_BENCH(return new SkSLCompileBench(#name, name ## _SRC, /*optimize=*/true, Output::kMetal);) \ 117cb93a386Sopenharmony_ciDEF_BENCH(return new SkSLCompileBench(#name, name ## _SRC, /*optimize=*/true, Output::kSPIRV);) 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_ci// This fragment shader is from the third tile on the top row of GM_gradients_2pt_conical_outside. 120cb93a386Sopenharmony_ciCOMPILER_BENCH(large, R"( 121cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform half urange_Stage1_c0; 122cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform half4 uleftBorderColor_Stage1_c0_c0_c0; 123cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform half4 urightBorderColor_Stage1_c0_c0_c0; 124cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float3x3 umatrix_Stage1_c0_c0_c0_c0; 125cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform half2 ufocalParams_Stage1_c0_c0_c0_c0_c0; 126cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 uscale0_1_Stage1_c0_c0_c0_c1; 127cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 uscale2_3_Stage1_c0_c0_c0_c1; 128cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 uscale4_5_Stage1_c0_c0_c0_c1; 129cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 uscale6_7_Stage1_c0_c0_c0_c1; 130cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 ubias0_1_Stage1_c0_c0_c0_c1; 131cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 ubias2_3_Stage1_c0_c0_c0_c1; 132cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 ubias4_5_Stage1_c0_c0_c0_c1; 133cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float4 ubias6_7_Stage1_c0_c0_c0_c1; 134cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform half4 uthresholds1_7_Stage1_c0_c0_c0_c1; 135cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform half4 uthresholds9_13_Stage1_c0_c0_c0_c1; 136cb93a386Sopenharmony_ciflat in half4 vcolor_Stage0; 137cb93a386Sopenharmony_cinoperspective in float2 vTransformedCoords_0_Stage0; 138cb93a386Sopenharmony_ciout half4 sk_FragColor; 139cb93a386Sopenharmony_cihalf4 TwoPointConicalGradientLayout_Stage1_c0_c0_c0_c0_c0(half4 _input) 140cb93a386Sopenharmony_ci{ 141cb93a386Sopenharmony_ci float t = -1.0; 142cb93a386Sopenharmony_ci half v = 1.0; 143cb93a386Sopenharmony_ci @switch (2) 144cb93a386Sopenharmony_ci { 145cb93a386Sopenharmony_ci case 1: 146cb93a386Sopenharmony_ci { 147cb93a386Sopenharmony_ci half r0_2 = ufocalParams_Stage1_c0_c0_c0_c0_c0.y; 148cb93a386Sopenharmony_ci t = float(r0_2) - vTransformedCoords_0_Stage0.y * vTransformedCoords_0_Stage0.y; 149cb93a386Sopenharmony_ci if (t >= 0.0) 150cb93a386Sopenharmony_ci { 151cb93a386Sopenharmony_ci t = vTransformedCoords_0_Stage0.x + sqrt(t); 152cb93a386Sopenharmony_ci } 153cb93a386Sopenharmony_ci else 154cb93a386Sopenharmony_ci { 155cb93a386Sopenharmony_ci v = -1.0; 156cb93a386Sopenharmony_ci } 157cb93a386Sopenharmony_ci } 158cb93a386Sopenharmony_ci break; 159cb93a386Sopenharmony_ci case 0: 160cb93a386Sopenharmony_ci { 161cb93a386Sopenharmony_ci half r0 = ufocalParams_Stage1_c0_c0_c0_c0_c0.x; 162cb93a386Sopenharmony_ci @if (true) 163cb93a386Sopenharmony_ci { 164cb93a386Sopenharmony_ci t = length(vTransformedCoords_0_Stage0) - float(r0); 165cb93a386Sopenharmony_ci } 166cb93a386Sopenharmony_ci else 167cb93a386Sopenharmony_ci { 168cb93a386Sopenharmony_ci t = -length(vTransformedCoords_0_Stage0) - float(r0); 169cb93a386Sopenharmony_ci } 170cb93a386Sopenharmony_ci } 171cb93a386Sopenharmony_ci break; 172cb93a386Sopenharmony_ci case 2: 173cb93a386Sopenharmony_ci { 174cb93a386Sopenharmony_ci half invR1 = ufocalParams_Stage1_c0_c0_c0_c0_c0.x; 175cb93a386Sopenharmony_ci half fx = ufocalParams_Stage1_c0_c0_c0_c0_c0.y; 176cb93a386Sopenharmony_ci float x_t = -1.0; 177cb93a386Sopenharmony_ci @if (false) 178cb93a386Sopenharmony_ci { 179cb93a386Sopenharmony_ci x_t = dot(vTransformedCoords_0_Stage0, vTransformedCoords_0_Stage0) / vTransformedCoords_0_Stage0.x; 180cb93a386Sopenharmony_ci } 181cb93a386Sopenharmony_ci else if (false) 182cb93a386Sopenharmony_ci { 183cb93a386Sopenharmony_ci x_t = length(vTransformedCoords_0_Stage0) - vTransformedCoords_0_Stage0.x * float(invR1); 184cb93a386Sopenharmony_ci } 185cb93a386Sopenharmony_ci else 186cb93a386Sopenharmony_ci { 187cb93a386Sopenharmony_ci float temp = vTransformedCoords_0_Stage0.x * vTransformedCoords_0_Stage0.x - vTransformedCoords_0_Stage0.y * vTransformedCoords_0_Stage0.y; 188cb93a386Sopenharmony_ci if (temp >= 0.0) 189cb93a386Sopenharmony_ci { 190cb93a386Sopenharmony_ci @if (false || !true) 191cb93a386Sopenharmony_ci { 192cb93a386Sopenharmony_ci x_t = -sqrt(temp) - vTransformedCoords_0_Stage0.x * float(invR1); 193cb93a386Sopenharmony_ci } 194cb93a386Sopenharmony_ci else 195cb93a386Sopenharmony_ci { 196cb93a386Sopenharmony_ci x_t = sqrt(temp) - vTransformedCoords_0_Stage0.x * float(invR1); 197cb93a386Sopenharmony_ci } 198cb93a386Sopenharmony_ci } 199cb93a386Sopenharmony_ci } 200cb93a386Sopenharmony_ci @if (!false) 201cb93a386Sopenharmony_ci { 202cb93a386Sopenharmony_ci if (x_t <= 0.0) 203cb93a386Sopenharmony_ci { 204cb93a386Sopenharmony_ci v = -1.0; 205cb93a386Sopenharmony_ci } 206cb93a386Sopenharmony_ci } 207cb93a386Sopenharmony_ci @if (true) 208cb93a386Sopenharmony_ci { 209cb93a386Sopenharmony_ci @if (false) 210cb93a386Sopenharmony_ci { 211cb93a386Sopenharmony_ci t = x_t; 212cb93a386Sopenharmony_ci } 213cb93a386Sopenharmony_ci else 214cb93a386Sopenharmony_ci { 215cb93a386Sopenharmony_ci t = x_t + float(fx); 216cb93a386Sopenharmony_ci } 217cb93a386Sopenharmony_ci } 218cb93a386Sopenharmony_ci else 219cb93a386Sopenharmony_ci { 220cb93a386Sopenharmony_ci @if (false) 221cb93a386Sopenharmony_ci { 222cb93a386Sopenharmony_ci t = -x_t; 223cb93a386Sopenharmony_ci } 224cb93a386Sopenharmony_ci else 225cb93a386Sopenharmony_ci { 226cb93a386Sopenharmony_ci t = -x_t + float(fx); 227cb93a386Sopenharmony_ci } 228cb93a386Sopenharmony_ci } 229cb93a386Sopenharmony_ci @if (false) 230cb93a386Sopenharmony_ci { 231cb93a386Sopenharmony_ci t = 1.0 - t; 232cb93a386Sopenharmony_ci } 233cb93a386Sopenharmony_ci } 234cb93a386Sopenharmony_ci break; 235cb93a386Sopenharmony_ci } 236cb93a386Sopenharmony_ci return half4(half(t), v, 0.0, 0.0); 237cb93a386Sopenharmony_ci} 238cb93a386Sopenharmony_cihalf4 MatrixEffect_Stage1_c0_c0_c0_c0(half4 _input) 239cb93a386Sopenharmony_ci{ 240cb93a386Sopenharmony_ci return TwoPointConicalGradientLayout_Stage1_c0_c0_c0_c0_c0(_input); 241cb93a386Sopenharmony_ci} 242cb93a386Sopenharmony_cihalf4 UnrolledBinaryGradientColorizer_Stage1_c0_c0_c0_c1(half4 _input, float2 _coords) 243cb93a386Sopenharmony_ci{ 244cb93a386Sopenharmony_ci half t = half(_coords.x); 245cb93a386Sopenharmony_ci float4 scale; 246cb93a386Sopenharmony_ci float4 bias; 247cb93a386Sopenharmony_ci if (4 <= 4 || t < uthresholds1_7_Stage1_c0_c0_c0_c1.w) 248cb93a386Sopenharmony_ci { 249cb93a386Sopenharmony_ci if (4 <= 2 || t < uthresholds1_7_Stage1_c0_c0_c0_c1.y) 250cb93a386Sopenharmony_ci { 251cb93a386Sopenharmony_ci if (4 <= 1 || t < uthresholds1_7_Stage1_c0_c0_c0_c1.x) 252cb93a386Sopenharmony_ci { 253cb93a386Sopenharmony_ci scale = uscale0_1_Stage1_c0_c0_c0_c1; 254cb93a386Sopenharmony_ci bias = ubias0_1_Stage1_c0_c0_c0_c1; 255cb93a386Sopenharmony_ci } 256cb93a386Sopenharmony_ci else 257cb93a386Sopenharmony_ci { 258cb93a386Sopenharmony_ci scale = uscale2_3_Stage1_c0_c0_c0_c1; 259cb93a386Sopenharmony_ci bias = ubias2_3_Stage1_c0_c0_c0_c1; 260cb93a386Sopenharmony_ci } 261cb93a386Sopenharmony_ci } 262cb93a386Sopenharmony_ci else 263cb93a386Sopenharmony_ci { 264cb93a386Sopenharmony_ci if (4 <= 3 || t < uthresholds1_7_Stage1_c0_c0_c0_c1.z) 265cb93a386Sopenharmony_ci { 266cb93a386Sopenharmony_ci scale = uscale4_5_Stage1_c0_c0_c0_c1; 267cb93a386Sopenharmony_ci bias = ubias4_5_Stage1_c0_c0_c0_c1; 268cb93a386Sopenharmony_ci } 269cb93a386Sopenharmony_ci else 270cb93a386Sopenharmony_ci { 271cb93a386Sopenharmony_ci scale = uscale6_7_Stage1_c0_c0_c0_c1; 272cb93a386Sopenharmony_ci bias = ubias6_7_Stage1_c0_c0_c0_c1; 273cb93a386Sopenharmony_ci } 274cb93a386Sopenharmony_ci } 275cb93a386Sopenharmony_ci } 276cb93a386Sopenharmony_ci else 277cb93a386Sopenharmony_ci { 278cb93a386Sopenharmony_ci if (4 <= 6 || t < uthresholds9_13_Stage1_c0_c0_c0_c1.y) 279cb93a386Sopenharmony_ci { 280cb93a386Sopenharmony_ci if (4 <= 5 || t < uthresholds9_13_Stage1_c0_c0_c0_c1.x) 281cb93a386Sopenharmony_ci { 282cb93a386Sopenharmony_ci scale = float4(0); 283cb93a386Sopenharmony_ci bias = float4(0); 284cb93a386Sopenharmony_ci } 285cb93a386Sopenharmony_ci else 286cb93a386Sopenharmony_ci { 287cb93a386Sopenharmony_ci scale = float4(0); 288cb93a386Sopenharmony_ci bias = float4(0); 289cb93a386Sopenharmony_ci } 290cb93a386Sopenharmony_ci } 291cb93a386Sopenharmony_ci else 292cb93a386Sopenharmony_ci { 293cb93a386Sopenharmony_ci if (4 <= 7 || t < uthresholds9_13_Stage1_c0_c0_c0_c1.z) 294cb93a386Sopenharmony_ci { 295cb93a386Sopenharmony_ci scale = float4(0); 296cb93a386Sopenharmony_ci bias = float4(0); 297cb93a386Sopenharmony_ci } 298cb93a386Sopenharmony_ci else 299cb93a386Sopenharmony_ci { 300cb93a386Sopenharmony_ci scale = float4(0); 301cb93a386Sopenharmony_ci bias = float4(0); 302cb93a386Sopenharmony_ci } 303cb93a386Sopenharmony_ci } 304cb93a386Sopenharmony_ci } 305cb93a386Sopenharmony_ci return half4(float(t) * scale + bias); 306cb93a386Sopenharmony_ci} 307cb93a386Sopenharmony_cihalf4 ClampedGradientEffect_Stage1_c0_c0_c0(half4 _input) 308cb93a386Sopenharmony_ci{ 309cb93a386Sopenharmony_ci half4 t = MatrixEffect_Stage1_c0_c0_c0_c0(_input); 310cb93a386Sopenharmony_ci half4 outColor; 311cb93a386Sopenharmony_ci if (!false && t.y < 0.0) 312cb93a386Sopenharmony_ci { 313cb93a386Sopenharmony_ci outColor = half4(0.0); 314cb93a386Sopenharmony_ci } 315cb93a386Sopenharmony_ci else if (t.x < 0.0) 316cb93a386Sopenharmony_ci { 317cb93a386Sopenharmony_ci outColor = uleftBorderColor_Stage1_c0_c0_c0; 318cb93a386Sopenharmony_ci } 319cb93a386Sopenharmony_ci else if (t.x > 1.0) 320cb93a386Sopenharmony_ci { 321cb93a386Sopenharmony_ci outColor = urightBorderColor_Stage1_c0_c0_c0; 322cb93a386Sopenharmony_ci } 323cb93a386Sopenharmony_ci else 324cb93a386Sopenharmony_ci { 325cb93a386Sopenharmony_ci outColor = UnrolledBinaryGradientColorizer_Stage1_c0_c0_c0_c1(_input, float2(half2(t.x, 0.0))); 326cb93a386Sopenharmony_ci } 327cb93a386Sopenharmony_ci @if (false) 328cb93a386Sopenharmony_ci { 329cb93a386Sopenharmony_ci outColor.xyz *= outColor.w; 330cb93a386Sopenharmony_ci } 331cb93a386Sopenharmony_ci return outColor; 332cb93a386Sopenharmony_ci} 333cb93a386Sopenharmony_cihalf4 OverrideInputFragmentProcessor_Stage1_c0_c0(half4 _input) 334cb93a386Sopenharmony_ci{ 335cb93a386Sopenharmony_ci return ClampedGradientEffect_Stage1_c0_c0_c0(false ? half4(0) : half4(1.000000, 1.000000, 1.000000, 1.000000)); 336cb93a386Sopenharmony_ci} 337cb93a386Sopenharmony_cihalf4 DitherEffect_Stage1_c0(half4 _input) 338cb93a386Sopenharmony_ci{ 339cb93a386Sopenharmony_ci half4 color = OverrideInputFragmentProcessor_Stage1_c0_c0(_input); 340cb93a386Sopenharmony_ci half value; 341cb93a386Sopenharmony_ci @if (sk_Caps.integerSupport) 342cb93a386Sopenharmony_ci { 343cb93a386Sopenharmony_ci uint x = uint(sk_FragCoord.x); 344cb93a386Sopenharmony_ci uint y = uint(sk_FragCoord.y) ^ x; 345cb93a386Sopenharmony_ci uint m = (((((y & 1) << 5 | (x & 1) << 4) | (y & 2) << 2) | (x & 2) << 1) | (y & 4) >> 1) | (x & 4) >> 2; 346cb93a386Sopenharmony_ci value = half(m) / 64.0 - 0.4921875; 347cb93a386Sopenharmony_ci } 348cb93a386Sopenharmony_ci else 349cb93a386Sopenharmony_ci { 350cb93a386Sopenharmony_ci half4 bits = mod(half4(sk_FragCoord.yxyx), half4(2.0, 2.0, 4.0, 4.0)); 351cb93a386Sopenharmony_ci bits.zw = step(2.0, bits.zw); 352cb93a386Sopenharmony_ci bits.xz = abs(bits.xz - bits.yw); 353cb93a386Sopenharmony_ci value = dot(bits, half4(0.5, 0.25, 0.125, 0.0625)) - 0.46875; 354cb93a386Sopenharmony_ci } 355cb93a386Sopenharmony_ci return half4(clamp(color.xyz + value * urange_Stage1_c0, 0.0, color.w), color.w); 356cb93a386Sopenharmony_ci} 357cb93a386Sopenharmony_civoid main() 358cb93a386Sopenharmony_ci{ 359cb93a386Sopenharmony_ci // Stage 0, QuadPerEdgeAAGeometryProcessor 360cb93a386Sopenharmony_ci half4 outputColor_Stage0; 361cb93a386Sopenharmony_ci outputColor_Stage0 = vcolor_Stage0; 362cb93a386Sopenharmony_ci const half4 outputCoverage_Stage0 = half4(1); 363cb93a386Sopenharmony_ci half4 output_Stage1; 364cb93a386Sopenharmony_ci output_Stage1 = DitherEffect_Stage1_c0(outputColor_Stage0); 365cb93a386Sopenharmony_ci { 366cb93a386Sopenharmony_ci // Xfer Processor: Porter Duff 367cb93a386Sopenharmony_ci sk_FragColor = output_Stage1 * outputCoverage_Stage0; 368cb93a386Sopenharmony_ci } 369cb93a386Sopenharmony_ci} 370cb93a386Sopenharmony_ci)"); 371cb93a386Sopenharmony_ci 372cb93a386Sopenharmony_ci// This fragment shader is taken from GM_BlurDrawImage. 373cb93a386Sopenharmony_ciCOMPILER_BENCH(medium, R"( 374cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float3x3 umatrix_Stage1_c0_c0_c0; 375cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform half4 urectH_Stage2_c1; 376cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float3x3 umatrix_Stage2_c1_c0; 377cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform sampler2D uTextureSampler_0_Stage1; 378cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform sampler2D uTextureSampler_0_Stage2; 379cb93a386Sopenharmony_ciflat in half4 vcolor_Stage0; 380cb93a386Sopenharmony_cinoperspective in float2 vTransformedCoords_0_Stage0; 381cb93a386Sopenharmony_ciout half4 sk_FragColor; 382cb93a386Sopenharmony_cihalf4 TextureEffect_Stage1_c0_c0_c0_c0(half4 _input) 383cb93a386Sopenharmony_ci{ 384cb93a386Sopenharmony_ci return sample(uTextureSampler_0_Stage1, vTransformedCoords_0_Stage0); 385cb93a386Sopenharmony_ci} 386cb93a386Sopenharmony_cihalf4 MatrixEffect_Stage1_c0_c0_c0(half4 _input) 387cb93a386Sopenharmony_ci{ 388cb93a386Sopenharmony_ci return TextureEffect_Stage1_c0_c0_c0_c0(_input); 389cb93a386Sopenharmony_ci} 390cb93a386Sopenharmony_cihalf4 Blend_Stage1_c0_c0(half4 _input) 391cb93a386Sopenharmony_ci{ 392cb93a386Sopenharmony_ci // Blend mode: SrcIn (Compose-One behavior) 393cb93a386Sopenharmony_ci return blend_src_in(MatrixEffect_Stage1_c0_c0_c0(half4(1)), _input); 394cb93a386Sopenharmony_ci} 395cb93a386Sopenharmony_cihalf4 OverrideInputFragmentProcessor_Stage1_c0(half4 _input) 396cb93a386Sopenharmony_ci{ 397cb93a386Sopenharmony_ci return Blend_Stage1_c0_c0(false ? half4(0) : half4(1.000000, 1.000000, 1.000000, 1.000000)); 398cb93a386Sopenharmony_ci} 399cb93a386Sopenharmony_cihalf4 TextureEffect_Stage2_c1_c0_c0(half4 _input, float2 _coords) 400cb93a386Sopenharmony_ci{ 401cb93a386Sopenharmony_ci return sample(uTextureSampler_0_Stage2, _coords).000r; 402cb93a386Sopenharmony_ci} 403cb93a386Sopenharmony_cihalf4 MatrixEffect_Stage2_c1_c0(half4 _input, float2 _coords) 404cb93a386Sopenharmony_ci{ 405cb93a386Sopenharmony_ci return TextureEffect_Stage2_c1_c0_c0(_input, ((umatrix_Stage2_c1_c0) * _coords.xy1).xy); 406cb93a386Sopenharmony_ci} 407cb93a386Sopenharmony_cihalf4 RectBlurEffect_Stage2_c1(half4 _input) 408cb93a386Sopenharmony_ci{ 409cb93a386Sopenharmony_ci /* key */ const bool highPrecision = false; 410cb93a386Sopenharmony_ci half xCoverage; 411cb93a386Sopenharmony_ci half yCoverage; 412cb93a386Sopenharmony_ci float2 pos = sk_FragCoord.xy; 413cb93a386Sopenharmony_ci @if (false) 414cb93a386Sopenharmony_ci { 415cb93a386Sopenharmony_ci pos = (float3x3(1) * float3(pos, 1.0)).xy; 416cb93a386Sopenharmony_ci } 417cb93a386Sopenharmony_ci @if (true) 418cb93a386Sopenharmony_ci { 419cb93a386Sopenharmony_ci half2 xy; 420cb93a386Sopenharmony_ci @if (highPrecision) 421cb93a386Sopenharmony_ci { 422cb93a386Sopenharmony_ci xy = max(half2(float4(0).xy - pos), half2(pos - float4(0).zw)); 423cb93a386Sopenharmony_ci } 424cb93a386Sopenharmony_ci else 425cb93a386Sopenharmony_ci { 426cb93a386Sopenharmony_ci xy = max(half2(float2(urectH_Stage2_c1.xy) - pos), half2(pos - float2(urectH_Stage2_c1.zw))); 427cb93a386Sopenharmony_ci } 428cb93a386Sopenharmony_ci xCoverage = MatrixEffect_Stage2_c1_c0(_input, float2(half2(xy.x, 0.5))).w; 429cb93a386Sopenharmony_ci yCoverage = MatrixEffect_Stage2_c1_c0(_input, float2(half2(xy.y, 0.5))).w; 430cb93a386Sopenharmony_ci } 431cb93a386Sopenharmony_ci else 432cb93a386Sopenharmony_ci { 433cb93a386Sopenharmony_ci half4 rect; 434cb93a386Sopenharmony_ci @if (highPrecision) 435cb93a386Sopenharmony_ci { 436cb93a386Sopenharmony_ci rect.xy = half2(float4(0).xy - pos); 437cb93a386Sopenharmony_ci rect.zw = half2(pos - float4(0).zw); 438cb93a386Sopenharmony_ci } 439cb93a386Sopenharmony_ci else 440cb93a386Sopenharmony_ci { 441cb93a386Sopenharmony_ci rect.xy = half2(float2(urectH_Stage2_c1.xy) - pos); 442cb93a386Sopenharmony_ci rect.zw = half2(pos - float2(urectH_Stage2_c1.zw)); 443cb93a386Sopenharmony_ci } 444cb93a386Sopenharmony_ci xCoverage = (1.0 - MatrixEffect_Stage2_c1_c0(_input, float2(half2(rect.x, 0.5))).w) - MatrixEffect_Stage2_c1_c0(_input, float2(half2(rect.z, 0.5))).w; 445cb93a386Sopenharmony_ci yCoverage = (1.0 - MatrixEffect_Stage2_c1_c0(_input, float2(half2(rect.y, 0.5))).w) - MatrixEffect_Stage2_c1_c0(_input, float2(half2(rect.w, 0.5))).w; 446cb93a386Sopenharmony_ci } 447cb93a386Sopenharmony_ci return (_input * xCoverage) * yCoverage; 448cb93a386Sopenharmony_ci} 449cb93a386Sopenharmony_civoid main() 450cb93a386Sopenharmony_ci{ 451cb93a386Sopenharmony_ci // Stage 0, QuadPerEdgeAAGeometryProcessor 452cb93a386Sopenharmony_ci half4 outputColor_Stage0; 453cb93a386Sopenharmony_ci outputColor_Stage0 = vcolor_Stage0; 454cb93a386Sopenharmony_ci const half4 outputCoverage_Stage0 = half4(1); 455cb93a386Sopenharmony_ci half4 output_Stage1; 456cb93a386Sopenharmony_ci output_Stage1 = OverrideInputFragmentProcessor_Stage1_c0(outputColor_Stage0); 457cb93a386Sopenharmony_ci half4 output_Stage2; 458cb93a386Sopenharmony_ci output_Stage2 = RectBlurEffect_Stage2_c1(outputCoverage_Stage0); 459cb93a386Sopenharmony_ci { 460cb93a386Sopenharmony_ci // Xfer Processor: Porter Duff 461cb93a386Sopenharmony_ci sk_FragColor = output_Stage1 * output_Stage2; 462cb93a386Sopenharmony_ci } 463cb93a386Sopenharmony_ci} 464cb93a386Sopenharmony_ci)"); 465cb93a386Sopenharmony_ci 466cb93a386Sopenharmony_ci// This is the fragment shader used to blit the Viewer window when running the software rasterizer. 467cb93a386Sopenharmony_ciCOMPILER_BENCH(small, R"( 468cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform float3x3 umatrix_Stage1_c0_c0; 469cb93a386Sopenharmony_cilayout(set=0, binding=0) uniform sampler2D uTextureSampler_0_Stage1; 470cb93a386Sopenharmony_cinoperspective in float2 vTransformedCoords_0_Stage0; 471cb93a386Sopenharmony_ciout half4 sk_FragColor; 472cb93a386Sopenharmony_cihalf4 TextureEffect_Stage1_c0_c0_c0(half4 _input) 473cb93a386Sopenharmony_ci{ 474cb93a386Sopenharmony_ci return sample(uTextureSampler_0_Stage1, vTransformedCoords_0_Stage0); 475cb93a386Sopenharmony_ci} 476cb93a386Sopenharmony_cihalf4 MatrixEffect_Stage1_c0_c0(half4 _input) 477cb93a386Sopenharmony_ci{ 478cb93a386Sopenharmony_ci return TextureEffect_Stage1_c0_c0_c0(_input); 479cb93a386Sopenharmony_ci} 480cb93a386Sopenharmony_cihalf4 Blend_Stage1_c0(half4 _input) 481cb93a386Sopenharmony_ci{ 482cb93a386Sopenharmony_ci // Blend mode: Modulate (Compose-One behavior) 483cb93a386Sopenharmony_ci return blend_modulate(MatrixEffect_Stage1_c0_c0(half4(1)), _input); 484cb93a386Sopenharmony_ci} 485cb93a386Sopenharmony_civoid main() 486cb93a386Sopenharmony_ci{ 487cb93a386Sopenharmony_ci // Stage 0, QuadPerEdgeAAGeometryProcessor 488cb93a386Sopenharmony_ci half4 outputColor_Stage0 = half4(1); 489cb93a386Sopenharmony_ci const half4 outputCoverage_Stage0 = half4(1); 490cb93a386Sopenharmony_ci half4 output_Stage1; 491cb93a386Sopenharmony_ci output_Stage1 = Blend_Stage1_c0(outputColor_Stage0); 492cb93a386Sopenharmony_ci { 493cb93a386Sopenharmony_ci // Xfer Processor: Porter Duff 494cb93a386Sopenharmony_ci sk_FragColor = output_Stage1 * outputCoverage_Stage0; 495cb93a386Sopenharmony_ci } 496cb93a386Sopenharmony_ci} 497cb93a386Sopenharmony_ci)"); 498cb93a386Sopenharmony_ci 499cb93a386Sopenharmony_ciCOMPILER_BENCH(tiny, "void main() { sk_FragColor = half4(1); }"); 500cb93a386Sopenharmony_ci 501cb93a386Sopenharmony_ci#if defined(SK_BUILD_FOR_UNIX) 502cb93a386Sopenharmony_ci 503cb93a386Sopenharmony_ci#include <malloc.h> 504cb93a386Sopenharmony_ci 505cb93a386Sopenharmony_ci// These benchmarks aren't timed, they produce memory usage statistics. They run standalone, and 506cb93a386Sopenharmony_ci// directly add their results to the nanobench log. 507cb93a386Sopenharmony_civoid RunSkSLMemoryBenchmarks(NanoJSONResultsWriter* log) { 508cb93a386Sopenharmony_ci auto heap_bytes_used = []() { return mallinfo().uordblks; }; 509cb93a386Sopenharmony_ci auto bench = [log](const char* name, int bytes) { 510cb93a386Sopenharmony_ci log->beginObject(name); // test 511cb93a386Sopenharmony_ci log->beginObject("meta"); // config 512cb93a386Sopenharmony_ci log->appendS32("bytes", bytes); // sub_result 513cb93a386Sopenharmony_ci log->endObject(); // config 514cb93a386Sopenharmony_ci log->endObject(); // test 515cb93a386Sopenharmony_ci }; 516cb93a386Sopenharmony_ci 517cb93a386Sopenharmony_ci // Heap used by a default compiler (with no modules loaded) 518cb93a386Sopenharmony_ci { 519cb93a386Sopenharmony_ci int before = heap_bytes_used(); 520cb93a386Sopenharmony_ci GrShaderCaps caps; 521cb93a386Sopenharmony_ci SkSL::Compiler compiler(&caps); 522cb93a386Sopenharmony_ci int after = heap_bytes_used(); 523cb93a386Sopenharmony_ci bench("sksl_compiler_baseline", after - before); 524cb93a386Sopenharmony_ci } 525cb93a386Sopenharmony_ci 526cb93a386Sopenharmony_ci // Heap used by a compiler with the two main GPU modules (fragment + vertex) loaded 527cb93a386Sopenharmony_ci { 528cb93a386Sopenharmony_ci int before = heap_bytes_used(); 529cb93a386Sopenharmony_ci GrShaderCaps caps; 530cb93a386Sopenharmony_ci SkSL::Compiler compiler(&caps); 531cb93a386Sopenharmony_ci compiler.moduleForProgramKind(SkSL::ProgramKind::kVertex); 532cb93a386Sopenharmony_ci compiler.moduleForProgramKind(SkSL::ProgramKind::kFragment); 533cb93a386Sopenharmony_ci int after = heap_bytes_used(); 534cb93a386Sopenharmony_ci bench("sksl_compiler_gpu", after - before); 535cb93a386Sopenharmony_ci } 536cb93a386Sopenharmony_ci 537cb93a386Sopenharmony_ci // Heap used by a compiler with the runtime shader, color filter and blending modules loaded 538cb93a386Sopenharmony_ci { 539cb93a386Sopenharmony_ci int before = heap_bytes_used(); 540cb93a386Sopenharmony_ci GrShaderCaps caps; 541cb93a386Sopenharmony_ci SkSL::Compiler compiler(&caps); 542cb93a386Sopenharmony_ci compiler.moduleForProgramKind(SkSL::ProgramKind::kRuntimeColorFilter); 543cb93a386Sopenharmony_ci compiler.moduleForProgramKind(SkSL::ProgramKind::kRuntimeShader); 544cb93a386Sopenharmony_ci compiler.moduleForProgramKind(SkSL::ProgramKind::kRuntimeBlender); 545cb93a386Sopenharmony_ci int after = heap_bytes_used(); 546cb93a386Sopenharmony_ci bench("sksl_compiler_runtimeeffect", after - before); 547cb93a386Sopenharmony_ci } 548cb93a386Sopenharmony_ci} 549cb93a386Sopenharmony_ci 550cb93a386Sopenharmony_ci#else 551cb93a386Sopenharmony_ci 552cb93a386Sopenharmony_civoid RunSkSLMemoryBenchmarks(NanoJSONResultsWriter*) {} 553cb93a386Sopenharmony_ci 554cb93a386Sopenharmony_ci#endif 555