// // 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. // // InputLayoutCache.h: Defines InputLayoutCache, a class that builds and caches // D3D11 input layouts. #ifndef LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_ #define LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_ #include #include #include #include #include "common/angleutils.h" #include "libANGLE/Constants.h" #include "libANGLE/Error.h" #include "libANGLE/SizedMRUCache.h" #include "libANGLE/formatutils.h" #include "libANGLE/renderer/d3d/RendererD3D.h" #include "libANGLE/renderer/d3d/d3d11/ResourceManager11.h" namespace rx { struct PackedAttributeLayout { PackedAttributeLayout(); PackedAttributeLayout(const PackedAttributeLayout &other); void addAttributeData(GLenum glType, UINT semanticIndex, angle::FormatID vertexFormatID, unsigned int divisor); bool operator==(const PackedAttributeLayout &other) const; enum Flags { FLAG_USES_INSTANCED_SPRITES = 0x1, FLAG_INSTANCED_SPRITES_ACTIVE = 0x2, FLAG_INSTANCED_RENDERING_ACTIVE = 0x4, }; uint32_t numAttributes; uint32_t flags; gl::AttribArray attributeData; }; } // namespace rx namespace std { template <> struct hash { size_t operator()(const rx::PackedAttributeLayout &value) const { return angle::ComputeGenericHash(value); } }; } // namespace std namespace gl { class Program; } // namespace gl namespace rx { class Context11; struct TranslatedAttribute; struct TranslatedIndexData; struct SourceIndexData; class ProgramD3D; class Renderer11; class InputLayoutCache : angle::NonCopyable { public: InputLayoutCache(); ~InputLayoutCache(); void clear(); // Useful for testing void setCacheSize(size_t newCacheSize); angle::Result getInputLayout(Context11 *context, const gl::State &state, const std::vector ¤tAttributes, const AttribIndexArray &sortedSemanticIndices, gl::PrimitiveMode mode, GLsizei vertexCount, GLsizei instances, const d3d11::InputLayout **inputLayoutOut); private: angle::Result createInputLayout( Context11 *context11, const AttribIndexArray &sortedSemanticIndices, const std::vector ¤tAttributes, gl::PrimitiveMode mode, GLsizei vertexCount, GLsizei instances, d3d11::InputLayout *inputLayoutOut); // Starting cache size. static constexpr size_t kDefaultCacheSize = 1024; // The cache tries to clean up this many states at once. static constexpr size_t kGCLimit = 128; using LayoutCache = angle::base::HashingMRUCache; LayoutCache mLayoutCache; }; } // namespace rx #endif // LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_