|
1 // |
|
2 // Copyright (c) 2012-2013 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 // RenderStateCache.h: Defines rx::RenderStateCache, a cache of Direct3D render |
|
8 // state objects. |
|
9 |
|
10 #ifndef LIBGLESV2_RENDERER_RENDERSTATECACHE_H_ |
|
11 #define LIBGLESV2_RENDERER_RENDERSTATECACHE_H_ |
|
12 |
|
13 #include "libGLESv2/angletypes.h" |
|
14 #include "common/angleutils.h" |
|
15 |
|
16 namespace rx |
|
17 { |
|
18 |
|
19 class RenderStateCache |
|
20 { |
|
21 public: |
|
22 RenderStateCache(); |
|
23 virtual ~RenderStateCache(); |
|
24 |
|
25 void initialize(ID3D11Device *device); |
|
26 void clear(); |
|
27 |
|
28 // Increments refcount on the returned blend state, Release() must be called. |
|
29 ID3D11BlendState *getBlendState(const gl::BlendState &blendState); |
|
30 ID3D11RasterizerState *getRasterizerState(const gl::RasterizerState &rasterState, |
|
31 bool scissorEnabled, unsigned int depthSize); |
|
32 ID3D11DepthStencilState *getDepthStencilState(const gl::DepthStencilState &dsState); |
|
33 ID3D11SamplerState *getSamplerState(const gl::SamplerState &samplerState); |
|
34 |
|
35 private: |
|
36 DISALLOW_COPY_AND_ASSIGN(RenderStateCache); |
|
37 |
|
38 unsigned long long mCounter; |
|
39 |
|
40 // Blend state cache |
|
41 static std::size_t hashBlendState(const gl::BlendState &blendState); |
|
42 static bool compareBlendStates(const gl::BlendState &a, const gl::BlendState &b); |
|
43 static const unsigned int kMaxBlendStates; |
|
44 |
|
45 typedef std::size_t (*BlendStateHashFunction)(const gl::BlendState &); |
|
46 typedef bool (*BlendStateEqualityFunction)(const gl::BlendState &, const gl::BlendState &); |
|
47 typedef std::pair<ID3D11BlendState*, unsigned long long> BlendStateCounterPair; |
|
48 typedef std::unordered_map<gl::BlendState, BlendStateCounterPair, BlendStateHashFunction, BlendStateEqualityFunction> BlendStateMap; |
|
49 BlendStateMap mBlendStateCache; |
|
50 |
|
51 // Rasterizer state cache |
|
52 struct RasterizerStateKey |
|
53 { |
|
54 gl::RasterizerState rasterizerState; |
|
55 bool scissorEnabled; |
|
56 unsigned int depthSize; |
|
57 }; |
|
58 static std::size_t hashRasterizerState(const RasterizerStateKey &rasterState); |
|
59 static bool compareRasterizerStates(const RasterizerStateKey &a, const RasterizerStateKey &b); |
|
60 static const unsigned int kMaxRasterizerStates; |
|
61 |
|
62 typedef std::size_t (*RasterizerStateHashFunction)(const RasterizerStateKey &); |
|
63 typedef bool (*RasterizerStateEqualityFunction)(const RasterizerStateKey &, const RasterizerStateKey &); |
|
64 typedef std::pair<ID3D11RasterizerState*, unsigned long long> RasterizerStateCounterPair; |
|
65 typedef std::unordered_map<RasterizerStateKey, RasterizerStateCounterPair, RasterizerStateHashFunction, RasterizerStateEqualityFunction> RasterizerStateMap; |
|
66 RasterizerStateMap mRasterizerStateCache; |
|
67 |
|
68 // Depth stencil state cache |
|
69 static std::size_t hashDepthStencilState(const gl::DepthStencilState &dsState); |
|
70 static bool compareDepthStencilStates(const gl::DepthStencilState &a, const gl::DepthStencilState &b); |
|
71 static const unsigned int kMaxDepthStencilStates; |
|
72 |
|
73 typedef std::size_t (*DepthStencilStateHashFunction)(const gl::DepthStencilState &); |
|
74 typedef bool (*DepthStencilStateEqualityFunction)(const gl::DepthStencilState &, const gl::DepthStencilState &); |
|
75 typedef std::pair<ID3D11DepthStencilState*, unsigned long long> DepthStencilStateCounterPair; |
|
76 typedef std::unordered_map<gl::DepthStencilState, |
|
77 DepthStencilStateCounterPair, |
|
78 DepthStencilStateHashFunction, |
|
79 DepthStencilStateEqualityFunction> DepthStencilStateMap; |
|
80 DepthStencilStateMap mDepthStencilStateCache; |
|
81 |
|
82 // Sample state cache |
|
83 static std::size_t hashSamplerState(const gl::SamplerState &samplerState); |
|
84 static bool compareSamplerStates(const gl::SamplerState &a, const gl::SamplerState &b); |
|
85 static const unsigned int kMaxSamplerStates; |
|
86 |
|
87 typedef std::size_t (*SamplerStateHashFunction)(const gl::SamplerState &); |
|
88 typedef bool (*SamplerStateEqualityFunction)(const gl::SamplerState &, const gl::SamplerState &); |
|
89 typedef std::pair<ID3D11SamplerState*, unsigned long long> SamplerStateCounterPair; |
|
90 typedef std::unordered_map<gl::SamplerState, |
|
91 SamplerStateCounterPair, |
|
92 SamplerStateHashFunction, |
|
93 SamplerStateEqualityFunction> SamplerStateMap; |
|
94 SamplerStateMap mSamplerStateCache; |
|
95 |
|
96 ID3D11Device *mDevice; |
|
97 }; |
|
98 |
|
99 } |
|
100 |
|
101 #endif // LIBGLESV2_RENDERER_RENDERSTATECACHE_H_ |