1// 2// Copyright (c) 2002-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// IndexBuffer.h: Defines the abstract IndexBuffer class and IndexBufferInterface 8// class with derivations, classes that perform graphics API agnostic index buffer operations. 9 10#ifndef LIBGLESV2_RENDERER_INDEXBUFFER_H_ 11#define LIBGLESV2_RENDERER_INDEXBUFFER_H_ 12 13#include "common/angleutils.h" 14#include "libGLESv2/renderer/IndexRangeCache.h" 15 16namespace rx 17{ 18class Renderer; 19 20class IndexBuffer 21{ 22 public: 23 IndexBuffer(); 24 virtual ~IndexBuffer(); 25 26 virtual bool initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) = 0; 27 28 virtual bool mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) = 0; 29 virtual bool unmapBuffer() = 0; 30 31 virtual bool discard() = 0; 32 33 virtual GLenum getIndexType() const = 0; 34 virtual unsigned int getBufferSize() const = 0; 35 virtual bool setSize(unsigned int bufferSize, GLenum indexType) = 0; 36 37 unsigned int getSerial() const; 38 39 protected: 40 void updateSerial(); 41 42 private: 43 DISALLOW_COPY_AND_ASSIGN(IndexBuffer); 44 45 unsigned int mSerial; 46 static unsigned int mNextSerial; 47}; 48 49class IndexBufferInterface 50{ 51 public: 52 IndexBufferInterface(Renderer *renderer, bool dynamic); 53 virtual ~IndexBufferInterface(); 54 55 virtual bool reserveBufferSpace(unsigned int size, GLenum indexType) = 0; 56 57 GLenum getIndexType() const; 58 unsigned int getBufferSize() const; 59 60 unsigned int getSerial() const; 61 62 bool mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset); 63 bool unmapBuffer(); 64 65 IndexBuffer *getIndexBuffer() const; 66 67 protected: 68 unsigned int getWritePosition() const; 69 void setWritePosition(unsigned int writePosition); 70 71 bool discard(); 72 73 bool setBufferSize(unsigned int bufferSize, GLenum indexType); 74 75 private: 76 DISALLOW_COPY_AND_ASSIGN(IndexBufferInterface); 77 78 rx::Renderer *const mRenderer; 79 80 IndexBuffer* mIndexBuffer; 81 82 unsigned int mWritePosition; 83 bool mDynamic; 84}; 85 86class StreamingIndexBufferInterface : public IndexBufferInterface 87{ 88 public: 89 StreamingIndexBufferInterface(Renderer *renderer); 90 ~StreamingIndexBufferInterface(); 91 92 virtual bool reserveBufferSpace(unsigned int size, GLenum indexType); 93}; 94 95class StaticIndexBufferInterface : public IndexBufferInterface 96{ 97 public: 98 explicit StaticIndexBufferInterface(Renderer *renderer); 99 ~StaticIndexBufferInterface(); 100 101 virtual bool reserveBufferSpace(unsigned int size, GLenum indexType); 102 103 IndexRangeCache *getIndexRangeCache(); 104 105 private: 106 IndexRangeCache mIndexRangeCache; 107}; 108 109} 110 111#endif // LIBGLESV2_RENDERER_INDEXBUFFER_H_