blob: c62726595ab9aeeae144552203a38de57b7e2a4e [file] [log] [blame]
/*
* 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