1 /* 2 * Copyright 2021 Google LLC 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 skgpu_ProgramCache_DEFINED 9 #define skgpu_ProgramCache_DEFINED 10 11 #include <unordered_map> 12 #include <string> 13 #include <vector> 14 #include "experimental/graphite/src/ContextUtils.h" 15 #include "include/core/SkRefCnt.h" 16 17 namespace skgpu { 18 19 class ProgramCache { 20 public: 21 ProgramCache(); 22 23 static constexpr uint32_t kInvalidProgramID = 0; 24 25 // TODO: this is a bit underspecified. It still needs the rendering technique info. 26 // Additionally, it still needs an entry point to generate the text of the program. 27 class ProgramInfo : public SkRefCnt { 28 public: 29 ProgramInfo(uint32_t uniqueID, Combination c); 30 ~ProgramInfo() override; 31 id()32 uint32_t id() const { return fID; } combo()33 Combination combo() const { return fCombination; } 34 35 std::string getMSL() const; 36 37 private: 38 const uint32_t fID; 39 const Combination fCombination; 40 // TODO: store the rendering technique info from Chris here 41 }; 42 43 // TODO: we need the rendering technique info from Chris for this look up 44 sk_sp<ProgramInfo> findOrCreateProgram(Combination); 45 46 sk_sp<ProgramInfo> lookup(uint32_t uniqueID); 47 48 // The number of unique programs in the cache count()49 size_t count() const { 50 SkASSERT(fProgramHash.size()+1 == fProgramVector.size()); 51 return fProgramHash.size(); 52 } 53 54 private: 55 struct Hash { 56 size_t operator()(Combination) const; 57 }; 58 59 std::unordered_map<Combination, sk_sp<ProgramInfo>, Hash> fProgramHash; 60 std::vector<sk_sp<ProgramInfo>> fProgramVector; 61 // The ProgramInfo's unique ID is only unique w/in a Recorder _not_ globally 62 uint32_t fNextUniqueID = 1; 63 }; 64 65 } // namespace skgpu 66 67 #endif // skgpu_ProgramCache_DEFINED 68