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/gpu/GrConfig.h" 13 #include <atomic> 14 15 #if GR_TEST_UTILS 16 #include "include/private/SkTArray.h" 17 class SkString; 18 #endif 19 20 class GrThreadSafePipelineBuilder : public SkRefCnt { 21 public: 22 GrThreadSafePipelineBuilder() = default; 23 24 class Stats { 25 public: 26 enum class ProgramCacheResult { 27 kHit, // the program was found in the cache 28 kMiss, // the program was not found in the cache (and was, thus, compiled) 29 kPartial, // a precompiled version was found in the persistent cache 30 31 kLast = kPartial 32 }; 33 34 #if GR_GPU_STATS 35 static const int kNumProgramCacheResults = (int)ProgramCacheResult::kLast + 1; 36 37 Stats() = default; 38 shaderCompilations()39 int shaderCompilations() const { return fShaderCompilations; } incShaderCompilations()40 void incShaderCompilations() { fShaderCompilations++; } 41 numInlineCompilationFailures()42 int numInlineCompilationFailures() const { return fNumInlineCompilationFailures; } incNumInlineCompilationFailures()43 void incNumInlineCompilationFailures() { ++fNumInlineCompilationFailures; } 44 numInlineProgramCacheResult(ProgramCacheResult stat)45 int numInlineProgramCacheResult(ProgramCacheResult stat) const { 46 return fInlineProgramCacheStats[(int) stat]; 47 } incNumInlineProgramCacheResult(ProgramCacheResult stat)48 void incNumInlineProgramCacheResult(ProgramCacheResult stat) { 49 ++fInlineProgramCacheStats[(int) stat]; 50 } 51 numPreCompilationFailures()52 int numPreCompilationFailures() const { return fNumPreCompilationFailures; } incNumPreCompilationFailures()53 void incNumPreCompilationFailures() { ++fNumPreCompilationFailures; } 54 numPreProgramCacheResult(ProgramCacheResult stat)55 int numPreProgramCacheResult(ProgramCacheResult stat) const { 56 return fPreProgramCacheStats[(int) stat]; 57 } incNumPreProgramCacheResult(ProgramCacheResult stat)58 void incNumPreProgramCacheResult(ProgramCacheResult stat) { 59 ++fPreProgramCacheStats[(int) stat]; 60 } 61 numCompilationFailures()62 int numCompilationFailures() const { return fNumCompilationFailures; } incNumCompilationFailures()63 void incNumCompilationFailures() { ++fNumCompilationFailures; } 64 numPartialCompilationSuccesses()65 int numPartialCompilationSuccesses() const { return fNumPartialCompilationSuccesses; } incNumPartialCompilationSuccesses()66 void incNumPartialCompilationSuccesses() { ++fNumPartialCompilationSuccesses; } 67 numCompilationSuccesses()68 int numCompilationSuccesses() const { return fNumCompilationSuccesses; } incNumCompilationSuccesses()69 void incNumCompilationSuccesses() { ++fNumCompilationSuccesses; } 70 71 #if GR_TEST_UTILS 72 void dump(SkString*); 73 void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values); 74 #endif 75 76 private: 77 std::atomic<int> fShaderCompilations{0}; 78 79 std::atomic<int> fNumInlineCompilationFailures{0}; 80 std::atomic<int> fInlineProgramCacheStats[kNumProgramCacheResults]{}; 81 82 std::atomic<int> fNumPreCompilationFailures{0}; 83 std::atomic<int> fPreProgramCacheStats[kNumProgramCacheResults]{}; 84 85 std::atomic<int> fNumCompilationFailures{0}; 86 std::atomic<int> fNumPartialCompilationSuccesses{0}; 87 std::atomic<int> fNumCompilationSuccesses{0}; 88 89 #else incShaderCompilations()90 void incShaderCompilations() {} incNumInlineCompilationFailures()91 void incNumInlineCompilationFailures() {} incNumInlineProgramCacheResult(ProgramCacheResult stat)92 void incNumInlineProgramCacheResult(ProgramCacheResult stat) {} incNumPreCompilationFailures()93 void incNumPreCompilationFailures() {} incNumPreProgramCacheResult(ProgramCacheResult stat)94 void incNumPreProgramCacheResult(ProgramCacheResult stat) {} incNumCompilationFailures()95 void incNumCompilationFailures() {} incNumPartialCompilationSuccesses()96 void incNumPartialCompilationSuccesses() {} incNumCompilationSuccesses()97 void incNumCompilationSuccesses() {} 98 99 #if GR_TEST_UTILS dump(SkString *)100 void dump(SkString*) {} dumpKeyValuePairs(SkTArray<SkString> *,SkTArray<double> *)101 void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {} 102 #endif 103 104 #endif // GR_GPU_STATS 105 }; 106 stats()107 Stats* stats() { return &fStats; } 108 109 protected: 110 Stats fStats; 111 }; 112 113 #endif 114