1 /* 2 * Copyright 2021 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrThreadSafePipelineBuilder_Base_DEFINED 9 #define GrThreadSafePipelineBuilder_Base_DEFINED 10 11 #include "include/core/SkRefCnt.h" 12 #include "include/core/SkString.h" // IWYU pragma: keep 13 #include "include/core/SkTypes.h" 14 #include "include/private/base/SkTArray.h" 15 16 #include <atomic> 17 18 class GrThreadSafePipelineBuilder : public SkRefCnt { 19 public: 20 GrThreadSafePipelineBuilder() = default; 21 22 class Stats { 23 public: 24 enum class ProgramCacheResult { 25 kHit, // the program was found in the cache 26 kMiss, // the program was not found in the cache (and was, thus, compiled) 27 kPartial, // a precompiled version was found in the persistent cache 28 29 kLast = kPartial 30 }; 31 32 #if GR_GPU_STATS 33 static const int kNumProgramCacheResults = (int)ProgramCacheResult::kLast + 1; 34 35 Stats() = default; 36 shaderCompilations()37 int shaderCompilations() const { return fShaderCompilations; } incShaderCompilations()38 void incShaderCompilations() { fShaderCompilations++; } 39 numInlineCompilationFailures()40 int numInlineCompilationFailures() const { return fNumInlineCompilationFailures; } incNumInlineCompilationFailures()41 void incNumInlineCompilationFailures() { ++fNumInlineCompilationFailures; } 42 numInlineProgramCacheResult(ProgramCacheResult stat)43 int numInlineProgramCacheResult(ProgramCacheResult stat) const { 44 return fInlineProgramCacheStats[(int) stat]; 45 } incNumInlineProgramCacheResult(ProgramCacheResult stat)46 void incNumInlineProgramCacheResult(ProgramCacheResult stat) { 47 ++fInlineProgramCacheStats[(int) stat]; 48 } 49 numPreCompilationFailures()50 int numPreCompilationFailures() const { return fNumPreCompilationFailures; } incNumPreCompilationFailures()51 void incNumPreCompilationFailures() { ++fNumPreCompilationFailures; } 52 numPreProgramCacheResult(ProgramCacheResult stat)53 int numPreProgramCacheResult(ProgramCacheResult stat) const { 54 return fPreProgramCacheStats[(int) stat]; 55 } incNumPreProgramCacheResult(ProgramCacheResult stat)56 void incNumPreProgramCacheResult(ProgramCacheResult stat) { 57 ++fPreProgramCacheStats[(int) stat]; 58 } 59 numCompilationFailures()60 int numCompilationFailures() const { return fNumCompilationFailures; } incNumCompilationFailures()61 void incNumCompilationFailures() { ++fNumCompilationFailures; } 62 numPartialCompilationSuccesses()63 int numPartialCompilationSuccesses() const { return fNumPartialCompilationSuccesses; } incNumPartialCompilationSuccesses()64 void incNumPartialCompilationSuccesses() { ++fNumPartialCompilationSuccesses; } 65 numCompilationSuccesses()66 int numCompilationSuccesses() const { return fNumCompilationSuccesses; } incNumCompilationSuccesses()67 void incNumCompilationSuccesses() { ++fNumCompilationSuccesses; } 68 69 #if defined(GPU_TEST_UTILS) 70 void dump(SkString*); 71 void dumpKeyValuePairs(skia_private::TArray<SkString>* keys, skia_private::TArray<double>* values); 72 #endif 73 74 private: 75 std::atomic<int> fShaderCompilations{0}; 76 77 std::atomic<int> fNumInlineCompilationFailures{0}; 78 std::atomic<int> fInlineProgramCacheStats[kNumProgramCacheResults]{}; 79 80 std::atomic<int> fNumPreCompilationFailures{0}; 81 std::atomic<int> fPreProgramCacheStats[kNumProgramCacheResults]{}; 82 83 std::atomic<int> fNumCompilationFailures{0}; 84 std::atomic<int> fNumPartialCompilationSuccesses{0}; 85 std::atomic<int> fNumCompilationSuccesses{0}; 86 87 #else incShaderCompilations()88 void incShaderCompilations() {} incNumInlineCompilationFailures()89 void incNumInlineCompilationFailures() {} incNumInlineProgramCacheResult(ProgramCacheResult stat)90 void incNumInlineProgramCacheResult(ProgramCacheResult stat) {} incNumPreCompilationFailures()91 void incNumPreCompilationFailures() {} incNumPreProgramCacheResult(ProgramCacheResult stat)92 void incNumPreProgramCacheResult(ProgramCacheResult stat) {} incNumCompilationFailures()93 void incNumCompilationFailures() {} incNumPartialCompilationSuccesses()94 void incNumPartialCompilationSuccesses() {} incNumCompilationSuccesses()95 void incNumCompilationSuccesses() {} 96 97 #if defined(GPU_TEST_UTILS) dump(SkString *)98 void dump(SkString*) {} dumpKeyValuePairs(skia_private::TArray<SkString> *,skia_private::TArray<double> *)99 void dumpKeyValuePairs(skia_private::TArray<SkString>*, skia_private::TArray<double>*) {} 100 #endif 101 102 #endif // GR_GPU_STATS 103 }; 104 stats()105 Stats* stats() { return &fStats; } 106 107 protected: 108 Stats fStats; 109 }; 110 111 #endif 112