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.
7 // ShaderCache: Defines rx::ShaderCache, a cache of Direct3D shader objects
8 // keyed by their byte code.
10 #ifndef LIBGLESV2_RENDERER_SHADER_CACHE_H_
11 #define LIBGLESV2_RENDERER_SHADER_CACHE_H_
13 #include "libGLESv2/Error.h"
15 #include "common/debug.h"
18 #include <unordered_map>
23 template <typename ShaderObject>
27 ShaderCache() : mDevice(NULL)
33 // Call clear while the device is still valid.
37 void initialize(IDirect3DDevice9* device)
42 gl::Error create(const DWORD *function, size_t length, ShaderObject **outShaderObject)
44 std::string key(reinterpret_cast<const char*>(function), length);
45 typename Map::iterator it = mMap.find(key);
49 *outShaderObject = it->second;
50 return gl::Error(GL_NO_ERROR);
54 HRESULT result = createShader(function, &shader);
57 return gl::Error(GL_OUT_OF_MEMORY, "Failed to create shader, result: 0x%X.", result);
60 // Random eviction policy.
61 if (mMap.size() >= kMaxMapSize)
63 SafeRelease(mMap.begin()->second);
64 mMap.erase(mMap.begin());
70 *outShaderObject = shader;
71 return gl::Error(GL_NO_ERROR);
76 for (typename Map::iterator it = mMap.begin(); it != mMap.end(); ++it)
78 SafeRelease(it->second);
85 DISALLOW_COPY_AND_ASSIGN(ShaderCache);
87 const static size_t kMaxMapSize = 100;
89 HRESULT createShader(const DWORD *function, IDirect3DVertexShader9 **shader)
91 return mDevice->CreateVertexShader(function, shader);
94 HRESULT createShader(const DWORD *function, IDirect3DPixelShader9 **shader)
96 return mDevice->CreatePixelShader(function, shader);
99 typedef std::unordered_map<std::string, ShaderObject*> Map;
102 IDirect3DDevice9 *mDevice;
105 typedef ShaderCache<IDirect3DVertexShader9> VertexShaderCache;
106 typedef ShaderCache<IDirect3DPixelShader9> PixelShaderCache;
110 #endif // LIBGLESV2_RENDERER_SHADER_CACHE_H_