• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright 2022 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 // MemoryShaderCache: Stores compiled shaders in memory so they don't
7 //   always have to be re-compiled. Can be used in conjunction with the platform
8 //   layer to warm up the cache from disk.
9 
10 #ifndef LIBANGLE_MEMORY_SHADER_CACHE_H_
11 #define LIBANGLE_MEMORY_SHADER_CACHE_H_
12 
13 #include <array>
14 
15 #include "GLSLANG/ShaderLang.h"
16 #include "common/MemoryBuffer.h"
17 #include "libANGLE/BlobCache.h"
18 #include "libANGLE/Error.h"
19 
20 namespace gl
21 {
22 class Context;
23 class Shader;
24 class ShaderState;
25 class ShCompilerInstance;
26 
27 class MemoryShaderCache final : angle::NonCopyable
28 {
29   public:
30     explicit MemoryShaderCache(egl::BlobCache &blobCache);
31     ~MemoryShaderCache();
32 
33     // Helper method that serializes a shader.
34     angle::Result putShader(const Context *context,
35                             const egl::BlobCache::Key &shaderHash,
36                             const Shader *shader);
37 
38     // Check the cache, and deserialize and load the shader if found. Evict existing hash if load
39     // fails.
40     angle::Result getShader(const Context *context,
41                             Shader *shader,
42                             const ShCompileOptions &compileOptions,
43                             const ShCompilerInstance &compilerInstance,
44                             const egl::BlobCache::Key &shaderHash);
45 
46     // Empty the cache.
47     void clear();
48 
49     // Returns the maximum cache size in bytes.
50     size_t maxSize() const;
51 
52   private:
53     egl::BlobCache &mBlobCache;
54 
55     std::mutex mHistogramMutex;
56 };
57 
58 }  // namespace gl
59 
60 #endif  // LIBANGLE_MEMORY_SHADER_CACHE_H_
61