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