1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef GPU_COMMAND_BUFFER_SERVICE_MEMORY_PROGRAM_CACHE_H_
6#define GPU_COMMAND_BUFFER_SERVICE_MEMORY_PROGRAM_CACHE_H_
7
8#include <map>
9#include <string>
10
11#include "base/containers/hash_tables.h"
12#include "base/containers/mru_cache.h"
13#include "base/memory/ref_counted.h"
14#include "base/memory/scoped_ptr.h"
15#include "gpu/command_buffer/service/gles2_cmd_decoder.h"
16#include "gpu/command_buffer/service/program_cache.h"
17#include "gpu/command_buffer/service/shader_translator.h"
18
19namespace gpu {
20namespace gles2 {
21
22// Program cache that stores binaries completely in-memory
23class GPU_EXPORT MemoryProgramCache : public ProgramCache {
24 public:
25  MemoryProgramCache();
26  explicit MemoryProgramCache(const size_t max_cache_size_bytes);
27  virtual ~MemoryProgramCache();
28
29  virtual ProgramLoadResult LoadLinkedProgram(
30      GLuint program,
31      Shader* shader_a,
32      const ShaderTranslatorInterface* translator_a,
33      Shader* shader_b,
34      const ShaderTranslatorInterface* translator_b,
35      const LocationMap* bind_attrib_location_map,
36      const ShaderCacheCallback& shader_callback) OVERRIDE;
37  virtual void SaveLinkedProgram(
38      GLuint program,
39      const Shader* shader_a,
40      const ShaderTranslatorInterface* translator_a,
41      const Shader* shader_b,
42      const ShaderTranslatorInterface* translator_b,
43      const LocationMap* bind_attrib_location_map,
44      const ShaderCacheCallback& shader_callback) OVERRIDE;
45
46  virtual void LoadProgram(const std::string& program) OVERRIDE;
47
48 private:
49  virtual void ClearBackend() OVERRIDE;
50
51  class ProgramCacheValue : public base::RefCounted<ProgramCacheValue> {
52   public:
53    ProgramCacheValue(GLsizei length,
54                      GLenum format,
55                      const char* data,
56                      const std::string& program_hash,
57                      const char* shader_0_hash,
58                      const ShaderTranslator::VariableMap& attrib_map_0,
59                      const ShaderTranslator::VariableMap& uniform_map_0,
60                      const char* shader_1_hash,
61                      const ShaderTranslator::VariableMap& attrib_map_1,
62                      const ShaderTranslator::VariableMap& uniform_map_1,
63                      MemoryProgramCache* program_cache);
64
65    GLsizei length() const {
66      return length_;
67    }
68
69    GLenum format() const {
70      return format_;
71    }
72
73    const char* data() const {
74      return data_.get();
75    }
76
77    const std::string& shader_0_hash() const {
78      return shader_0_hash_;
79    }
80
81    const ShaderTranslator::VariableMap& attrib_map_0() const {
82      return attrib_map_0_;
83    }
84
85    const ShaderTranslator::VariableMap& uniform_map_0() const {
86      return uniform_map_0_;
87    }
88
89    const std::string& shader_1_hash() const {
90      return shader_1_hash_;
91    }
92
93    const ShaderTranslator::VariableMap& attrib_map_1() const {
94      return attrib_map_1_;
95    }
96
97    const ShaderTranslator::VariableMap& uniform_map_1() const {
98      return uniform_map_1_;
99    }
100
101   private:
102    friend class base::RefCounted<ProgramCacheValue>;
103
104    ~ProgramCacheValue();
105
106    const GLsizei length_;
107    const GLenum format_;
108    const scoped_ptr<const char[]> data_;
109    const std::string program_hash_;
110    const std::string shader_0_hash_;
111    const ShaderTranslator::VariableMap attrib_map_0_;
112    const ShaderTranslator::VariableMap uniform_map_0_;
113    const std::string shader_1_hash_;
114    const ShaderTranslator::VariableMap attrib_map_1_;
115    const ShaderTranslator::VariableMap uniform_map_1_;
116    MemoryProgramCache* const program_cache_;
117
118    DISALLOW_COPY_AND_ASSIGN(ProgramCacheValue);
119  };
120
121  friend class ProgramCacheValue;
122
123  typedef base::MRUCache<std::string,
124                         scoped_refptr<ProgramCacheValue> > ProgramMRUCache;
125
126  const size_t max_size_bytes_;
127  size_t curr_size_bytes_;
128  ProgramMRUCache store_;
129
130  DISALLOW_COPY_AND_ASSIGN(MemoryProgramCache);
131};
132
133}  // namespace gles2
134}  // namespace gpu
135
136#endif  // GPU_COMMAND_BUFFER_SERVICE_MEMORY_PROGRAM_CACHE_H_
137