blob: 8db74d66b34a41a5d5bb0ac609e4fcc9abf23f1b [file] [log] [blame]
//
// Copyright (c) 2012-2014 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_