170a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com//
270a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
370a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com// Use of this source code is governed by a BSD-style license that can be
470a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com// found in the LICENSE file.
570a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com//
670a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
770a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com// VertexDeclarationCache.h: Defines a helper class to construct and cache vertex declarations.
870a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
970a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com#ifndef LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_
1070a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com#define LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_
1170a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
12f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang#include "libGLESv2/Error.h"
13c7a4104957aa1f6fa36e4e9cf65d36b699eb05bdBrandon Jones#include "libGLESv2/renderer/d3d/VertexDataManager.h"
1470a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
1570a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.comnamespace gl
1670a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com{
1770a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.comclass VertexDataManager;
1870a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com}
1970a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
2070a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.comnamespace rx
2170a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com{
2270a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
2370a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.comclass VertexDeclarationCache
2470a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com{
2570a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com  public:
2670a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    VertexDeclarationCache();
2770a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    ~VertexDeclarationCache();
2870a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
29f7100b981f0856b238252e6052509eecf8e5adedGeoff Lang    gl::Error applyDeclaration(IDirect3DDevice9 *device, TranslatedAttribute attributes[], gl::ProgramBinary *programBinary, GLsizei instances, GLsizei *repeatDraw);
3070a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
3170a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    void markStateDirty();
3270a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
3370a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com  private:
3470a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    UINT mMaxLru;
3570a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
3670a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    enum { NUM_VERTEX_DECL_CACHE_ENTRIES = 32 };
3770a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
3870a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    struct VBData
3970a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    {
4070a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com        unsigned int serial;
4170a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com        unsigned int stride;
4270a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com        unsigned int offset;
4370a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    };
4470a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
4570a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    VBData mAppliedVBs[gl::MAX_VERTEX_ATTRIBS];
4670a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    IDirect3DVertexDeclaration9 *mLastSetVDecl;
4770a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    bool mInstancingEnabled;
4870a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
4970a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    struct VertexDeclCacheEntry
5070a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    {
5170a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com        D3DVERTEXELEMENT9 cachedElements[gl::MAX_VERTEX_ATTRIBS + 1];
5270a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com        UINT lruCount;
5370a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com        IDirect3DVertexDeclaration9 *vertexDeclaration;
5470a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com    } mVertexDeclCache[NUM_VERTEX_DECL_CACHE_ENTRIES];
5570a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com};
5670a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
5770a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com}
5870a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com
5970a219bc1637c98cae30baf60de6d713131a2755daniel@transgaming.com#endif // LIBGLESV2_RENDERER_VERTEXDECLARATIONCACHE_H_
60