| /* |
| * Copyright 2021 Google Inc. |
| * |
| * Use of this source code is governed by a BSD-style license that can be |
| * found in the LICENSE file. |
| */ |
| |
| #ifndef GrThreadSafePipelineBuilder_Base_DEFINED |
| #define GrThreadSafePipelineBuilder_Base_DEFINED |
| |
| #include "include/core/SkRefCnt.h" |
| #include "include/gpu/GrConfig.h" |
| #include <atomic> |
| |
| #if GR_TEST_UTILS |
| #include "include/private/SkTArray.h" |
| class SkString; |
| #endif |
| |
| class GrThreadSafePipelineBuilder : public SkRefCnt { |
| public: |
| GrThreadSafePipelineBuilder() = default; |
| |
| class Stats { |
| public: |
| enum class ProgramCacheResult { |
| kHit, // the program was found in the cache |
| kMiss, // the program was not found in the cache (and was, thus, compiled) |
| kPartial, // a precompiled version was found in the persistent cache |
| |
| kLast = kPartial |
| }; |
| |
| #if GR_GPU_STATS |
| static const int kNumProgramCacheResults = (int)ProgramCacheResult::kLast + 1; |
| |
| Stats() = default; |
| |
| int shaderCompilations() const { return fShaderCompilations; } |
| void incShaderCompilations() { fShaderCompilations++; } |
| |
| int numInlineCompilationFailures() const { return fNumInlineCompilationFailures; } |
| void incNumInlineCompilationFailures() { ++fNumInlineCompilationFailures; } |
| |
| int numInlineProgramCacheResult(ProgramCacheResult stat) const { |
| return fInlineProgramCacheStats[(int) stat]; |
| } |
| void incNumInlineProgramCacheResult(ProgramCacheResult stat) { |
| ++fInlineProgramCacheStats[(int) stat]; |
| } |
| |
| int numPreCompilationFailures() const { return fNumPreCompilationFailures; } |
| void incNumPreCompilationFailures() { ++fNumPreCompilationFailures; } |
| |
| int numPreProgramCacheResult(ProgramCacheResult stat) const { |
| return fPreProgramCacheStats[(int) stat]; |
| } |
| void incNumPreProgramCacheResult(ProgramCacheResult stat) { |
| ++fPreProgramCacheStats[(int) stat]; |
| } |
| |
| int numCompilationFailures() const { return fNumCompilationFailures; } |
| void incNumCompilationFailures() { ++fNumCompilationFailures; } |
| |
| int numPartialCompilationSuccesses() const { return fNumPartialCompilationSuccesses; } |
| void incNumPartialCompilationSuccesses() { ++fNumPartialCompilationSuccesses; } |
| |
| int numCompilationSuccesses() const { return fNumCompilationSuccesses; } |
| void incNumCompilationSuccesses() { ++fNumCompilationSuccesses; } |
| |
| #if GR_TEST_UTILS |
| void dump(SkString*); |
| void dumpKeyValuePairs(SkTArray<SkString>* keys, SkTArray<double>* values); |
| #endif |
| |
| private: |
| std::atomic<int> fShaderCompilations{0}; |
| |
| std::atomic<int> fNumInlineCompilationFailures{0}; |
| std::atomic<int> fInlineProgramCacheStats[kNumProgramCacheResults]{}; |
| |
| std::atomic<int> fNumPreCompilationFailures{0}; |
| std::atomic<int> fPreProgramCacheStats[kNumProgramCacheResults]{}; |
| |
| std::atomic<int> fNumCompilationFailures{0}; |
| std::atomic<int> fNumPartialCompilationSuccesses{0}; |
| std::atomic<int> fNumCompilationSuccesses{0}; |
| |
| #else |
| void incShaderCompilations() {} |
| void incNumInlineCompilationFailures() {} |
| void incNumInlineProgramCacheResult(ProgramCacheResult stat) {} |
| void incNumPreCompilationFailures() {} |
| void incNumPreProgramCacheResult(ProgramCacheResult stat) {} |
| void incNumCompilationFailures() {} |
| void incNumPartialCompilationSuccesses() {} |
| void incNumCompilationSuccesses() {} |
| |
| #if GR_TEST_UTILS |
| void dump(SkString*) {} |
| void dumpKeyValuePairs(SkTArray<SkString>*, SkTArray<double>*) {} |
| #endif |
| |
| #endif // GR_GPU_STATS |
| }; |
| |
| Stats* stats() { return &fStats; } |
| |
| protected: |
| Stats fStats; |
| }; |
| |
| #endif |