| // |
| // 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 <GLES2/gl2.h> |
| |
| #include <cstddef> |
| |
| #include <array> |
| #include <map> |
| |
| #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<uint64_t> attributeData; |
| }; |
| } // namespace rx |
| |
| namespace std |
| { |
| template <> |
| struct hash<rx::PackedAttributeLayout> |
| { |
| 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<const TranslatedAttribute *> ¤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<const TranslatedAttribute *> ¤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<PackedAttributeLayout, d3d11::InputLayout>; |
| LayoutCache mLayoutCache; |
| }; |
| |
| } // namespace rx |
| |
| #endif // LIBANGLE_RENDERER_D3D_D3D11_INPUTLAYOUTCACHE_H_ |