• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright (c) 2012 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 
7 // ShaderCache: Defines rx::ShaderCache, a cache of Direct3D shader objects
8 // keyed by their byte code.
9 
10 #ifndef LIBGLESV2_RENDERER_SHADER_CACHE_H_
11 #define LIBGLESV2_RENDERER_SHADER_CACHE_H_
12 
13 #include "common/debug.h"
14 
15 namespace rx
16 {
17 template <typename ShaderObject>
18 class ShaderCache
19 {
20   public:
ShaderCache()21     ShaderCache() : mDevice(NULL)
22     {
23     }
24 
~ShaderCache()25     ~ShaderCache()
26     {
27         // Call clear while the device is still valid.
28         ASSERT(mMap.empty());
29     }
30 
initialize(IDirect3DDevice9 * device)31     void initialize(IDirect3DDevice9* device)
32     {
33         mDevice = device;
34     }
35 
create(const DWORD * function,size_t length)36     ShaderObject *create(const DWORD *function, size_t length)
37     {
38         std::string key(reinterpret_cast<const char*>(function), length);
39         typename Map::iterator it = mMap.find(key);
40         if (it != mMap.end())
41         {
42             it->second->AddRef();
43             return it->second;
44         }
45 
46         ShaderObject *shader;
47         HRESULT result = createShader(function, &shader);
48         if (FAILED(result))
49         {
50             return NULL;
51         }
52 
53         // Random eviction policy.
54         if (mMap.size() >= kMaxMapSize)
55         {
56             mMap.begin()->second->Release();
57             mMap.erase(mMap.begin());
58         }
59 
60         shader->AddRef();
61         mMap[key] = shader;
62 
63         return shader;
64     }
65 
clear()66     void clear()
67     {
68         for (typename Map::iterator it = mMap.begin(); it != mMap.end(); ++it)
69         {
70             it->second->Release();
71         }
72 
73         mMap.clear();
74     }
75 
76   private:
77     DISALLOW_COPY_AND_ASSIGN(ShaderCache);
78 
79     const static size_t kMaxMapSize = 100;
80 
createShader(const DWORD * function,IDirect3DVertexShader9 ** shader)81     HRESULT createShader(const DWORD *function, IDirect3DVertexShader9 **shader)
82     {
83         return mDevice->CreateVertexShader(function, shader);
84     }
85 
createShader(const DWORD * function,IDirect3DPixelShader9 ** shader)86     HRESULT createShader(const DWORD *function, IDirect3DPixelShader9 **shader)
87     {
88         return mDevice->CreatePixelShader(function, shader);
89     }
90 
91 #ifndef HASH_MAP
92 # ifdef _MSC_VER
93 #  define HASH_MAP stdext::hash_map
94 # else
95 #  define HASH_MAP std::unordered_map
96 # endif
97 #endif
98 
99     typedef HASH_MAP<std::string, ShaderObject*> Map;
100     Map mMap;
101 
102     IDirect3DDevice9 *mDevice;
103 };
104 
105 typedef ShaderCache<IDirect3DVertexShader9> VertexShaderCache;
106 typedef ShaderCache<IDirect3DPixelShader9> PixelShaderCache;
107 
108 }
109 
110 #endif   // LIBGLESV2_RENDERER_SHADER_CACHE_H_
111