xref: /aosp_15_r20/external/skia/src/gpu/ganesh/GrThreadSafePipelineBuilder.h (revision c8dee2aa9b3f27cf6c858bd81872bdeb2c07ed17)
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