Home | History | Annotate | Download | only in geometry
      1 //
      2 // Copyright (c) 2002-2010 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 // geometry/IndexDataManager.h: Defines the IndexDataManager, a class that
      8 // runs the Buffer translation process for index buffers.
      9 
     10 #ifndef LIBGLESV2_GEOMETRY_INDEXDATAMANAGER_H_
     11 #define LIBGLESV2_GEOMETRY_INDEXDATAMANAGER_H_
     12 
     13 #include <vector>
     14 #include <cstddef>
     15 
     16 #define GL_APICALL
     17 #include <GLES2/gl2.h>
     18 
     19 #include "libGLESv2/Context.h"
     20 
     21 namespace gl
     22 {
     23 
     24 struct TranslatedIndexData
     25 {
     26     UINT minIndex;
     27     UINT maxIndex;
     28     UINT startIndex;
     29 
     30     IDirect3DIndexBuffer9 *indexBuffer;
     31 };
     32 
     33 class IndexBuffer
     34 {
     35   public:
     36     IndexBuffer(IDirect3DDevice9 *device, UINT size, D3DFORMAT format);
     37     virtual ~IndexBuffer();
     38 
     39     UINT size() const { return mBufferSize; }
     40     virtual void *map(UINT requiredSpace, UINT *offset) = 0;
     41     void unmap();
     42     virtual void reserveSpace(UINT requiredSpace, GLenum type) = 0;
     43 
     44     IDirect3DIndexBuffer9 *getBuffer() const;
     45 
     46   protected:
     47     IDirect3DDevice9 *const mDevice;
     48 
     49     IDirect3DIndexBuffer9 *mIndexBuffer;
     50     UINT mBufferSize;
     51 
     52   private:
     53     DISALLOW_COPY_AND_ASSIGN(IndexBuffer);
     54 };
     55 
     56 class StreamingIndexBuffer : public IndexBuffer
     57 {
     58   public:
     59     StreamingIndexBuffer(IDirect3DDevice9 *device, UINT initialSize, D3DFORMAT format);
     60     ~StreamingIndexBuffer();
     61 
     62     void *map(UINT requiredSpace, UINT *offset);
     63     void reserveSpace(UINT requiredSpace, GLenum type);
     64 
     65   private:
     66     UINT mWritePosition;
     67 };
     68 
     69 class StaticIndexBuffer : public IndexBuffer
     70 {
     71   public:
     72     explicit StaticIndexBuffer(IDirect3DDevice9 *device);
     73     ~StaticIndexBuffer();
     74 
     75     void *map(UINT requiredSpace, UINT *offset);
     76     void reserveSpace(UINT requiredSpace, GLenum type);
     77 
     78     bool lookupType(GLenum type);
     79     UINT lookupRange(intptr_t offset, GLsizei count, UINT *minIndex, UINT *maxIndex);   // Returns the offset into the index buffer, or -1 if not found
     80     void addRange(intptr_t offset, GLsizei count, UINT minIndex, UINT maxIndex, UINT streamOffset);
     81 
     82   private:
     83     GLenum mCacheType;
     84 
     85     struct IndexRange
     86     {
     87         intptr_t offset;
     88         GLsizei count;
     89 
     90         UINT minIndex;
     91         UINT maxIndex;
     92         UINT streamOffset;
     93     };
     94 
     95     std::vector<IndexRange> mCache;
     96 };
     97 
     98 class IndexDataManager
     99 {
    100   public:
    101     IndexDataManager(Context *context, IDirect3DDevice9 *evice);
    102     virtual ~IndexDataManager();
    103 
    104     GLenum prepareIndexData(GLenum type, GLsizei count, Buffer *arrayElementBuffer, const void *indices, TranslatedIndexData *translated);
    105 
    106   private:
    107     DISALLOW_COPY_AND_ASSIGN(IndexDataManager);
    108 
    109     std::size_t typeSize(GLenum type) const;
    110     std::size_t indexSize(D3DFORMAT format) const;
    111 
    112     IDirect3DDevice9 *const mDevice;
    113 
    114     StreamingIndexBuffer *mStreamingBufferShort;
    115     StreamingIndexBuffer *mStreamingBufferInt;
    116 };
    117 
    118 }
    119 
    120 #endif   // LIBGLESV2_GEOMETRY_INDEXDATAMANAGER_H_
    121