| // |
| // Copyright 2012 The ANGLE Project Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| // |
| |
| // RenderStateCache.h: Defines rx::RenderStateCache, a cache of Direct3D render |
| // state objects. |
| |
| #ifndef LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_ |
| #define LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_ |
| |
| #include "common/angleutils.h" |
| #include "libANGLE/Error.h" |
| #include "libANGLE/SizedMRUCache.h" |
| #include "libANGLE/angletypes.h" |
| #include "libANGLE/renderer/d3d/d3d11/renderer11_utils.h" |
| |
| #include <unordered_map> |
| |
| namespace std |
| { |
| template <> |
| struct hash<rx::d3d11::BlendStateKey> |
| { |
| size_t operator()(const rx::d3d11::BlendStateKey &key) const |
| { |
| return angle::ComputeGenericHash(key); |
| } |
| }; |
| |
| template <> |
| struct hash<rx::d3d11::RasterizerStateKey> |
| { |
| size_t operator()(const rx::d3d11::RasterizerStateKey &key) const |
| { |
| return angle::ComputeGenericHash(key); |
| } |
| }; |
| |
| template <> |
| struct hash<gl::DepthStencilState> |
| { |
| size_t operator()(const gl::DepthStencilState &key) const |
| { |
| return angle::ComputeGenericHash(key); |
| } |
| }; |
| |
| template <> |
| struct hash<gl::SamplerState> |
| { |
| size_t operator()(const gl::SamplerState &key) const { return angle::ComputeGenericHash(key); } |
| }; |
| } // namespace std |
| |
| namespace rx |
| { |
| class Framebuffer11; |
| class Renderer11; |
| |
| class RenderStateCache : angle::NonCopyable |
| { |
| public: |
| RenderStateCache(); |
| virtual ~RenderStateCache(); |
| |
| void clear(); |
| |
| static d3d11::BlendStateKey GetBlendStateKey(const gl::Context *context, |
| Framebuffer11 *framebuffer11, |
| const gl::BlendState &blendState); |
| angle::Result getBlendState(const gl::Context *context, |
| Renderer11 *renderer, |
| const d3d11::BlendStateKey &key, |
| const d3d11::BlendState **outBlendState); |
| angle::Result getRasterizerState(const gl::Context *context, |
| Renderer11 *renderer, |
| const gl::RasterizerState &rasterState, |
| bool scissorEnabled, |
| ID3D11RasterizerState **outRasterizerState); |
| angle::Result getDepthStencilState(const gl::Context *context, |
| Renderer11 *renderer, |
| const gl::DepthStencilState &dsState, |
| const d3d11::DepthStencilState **outDSState); |
| angle::Result getSamplerState(const gl::Context *context, |
| Renderer11 *renderer, |
| const gl::SamplerState &samplerState, |
| ID3D11SamplerState **outSamplerState); |
| |
| private: |
| // MSDN's documentation of ID3D11Device::CreateBlendState, ID3D11Device::CreateRasterizerState, |
| // ID3D11Device::CreateDepthStencilState and ID3D11Device::CreateSamplerState claims the maximum |
| // number of unique states of each type an application can create is 4096 |
| // TODO(ShahmeerEsmail): Revisit the cache sizes to make sure they are appropriate for most |
| // scenarios. |
| static constexpr unsigned int kMaxStates = 4096; |
| |
| // The cache tries to clean up this many states at once. |
| static constexpr unsigned int kGCLimit = 128; |
| |
| // Blend state cache |
| using BlendStateMap = angle::base::HashingMRUCache<d3d11::BlendStateKey, d3d11::BlendState>; |
| BlendStateMap mBlendStateCache; |
| |
| // Rasterizer state cache |
| using RasterizerStateMap = |
| angle::base::HashingMRUCache<d3d11::RasterizerStateKey, d3d11::RasterizerState>; |
| RasterizerStateMap mRasterizerStateCache; |
| |
| // Depth stencil state cache |
| using DepthStencilStateMap = |
| angle::base::HashingMRUCache<gl::DepthStencilState, d3d11::DepthStencilState>; |
| DepthStencilStateMap mDepthStencilStateCache; |
| |
| // Sample state cache |
| using SamplerStateMap = angle::base::HashingMRUCache<gl::SamplerState, d3d11::SamplerState>; |
| SamplerStateMap mSamplerStateCache; |
| }; |
| |
| } // namespace rx |
| |
| #endif // LIBANGLE_RENDERER_D3D_D3D11_RENDERSTATECACHE_H_ |