1//
2// Copyright (c) 2012 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// VertexDeclarationCache.h: Defines a helper class to construct and cache vertex declarations.
8
9#ifndef LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_
10#define LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_
11
12#include "libGLESv2/renderer/VertexDataManager.h"
13
14namespace gl
15{
16class VertexDataManager;
17}
18
19namespace rx
20{
21
22class VertexDeclarationCache
23{
24  public:
25    VertexDeclarationCache();
26    ~VertexDeclarationCache();
27
28    GLenum applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::ProgramBinary *programBinary, GLsizei instances, GLsizei *repeatDraw);
29
30    void markStateDirty();
31
32  private:
33    UINT mMaxLru;
34
35    enum { NUM_VERTEX_DECL_CACHE_ENTRIES = 32 };
36
37    struct VBData
38    {
39        unsigned int serial;
40        unsigned int stride;
41        unsigned int offset;
42    };
43
44    VBData mAppliedVBs[gl::MAX_VERTEX_ATTRIBS];
45    IDirect3DVertexDeclaration9 *mLastSetVDecl;
46    bool mInstancingEnabled;
47
48    struct VertexDeclCacheEntry
49    {
50        D3DVERTEXELEMENT9 cachedElements[gl::MAX_VERTEX_ATTRIBS + 1];
51        UINT lruCount;
52        IDirect3DVertexDeclaration9 *vertexDeclaration;
53    } mVertexDeclCache[NUM_VERTEX_DECL_CACHE_ENTRIES];
54};
55
56}
57
58#endif // LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_
59