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