michael@0: // michael@0: // Copyright (c) 2002-2012 The ANGLE Project Authors. All rights reserved. michael@0: // Use of this source code is governed by a BSD-style license that can be michael@0: // found in the LICENSE file. michael@0: // michael@0: michael@0: // IndexBuffer.h: Defines the abstract IndexBuffer class and IndexBufferInterface michael@0: // class with derivations, classes that perform graphics API agnostic index buffer operations. michael@0: michael@0: #ifndef LIBGLESV2_RENDERER_INDEXBUFFER_H_ michael@0: #define LIBGLESV2_RENDERER_INDEXBUFFER_H_ michael@0: michael@0: #include "common/angleutils.h" michael@0: #include "libGLESv2/renderer/IndexRangeCache.h" michael@0: michael@0: namespace rx michael@0: { michael@0: class Renderer; michael@0: michael@0: class IndexBuffer michael@0: { michael@0: public: michael@0: IndexBuffer(); michael@0: virtual ~IndexBuffer(); michael@0: michael@0: virtual bool initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) = 0; michael@0: michael@0: virtual bool mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) = 0; michael@0: virtual bool unmapBuffer() = 0; michael@0: michael@0: virtual bool discard() = 0; michael@0: michael@0: virtual GLenum getIndexType() const = 0; michael@0: virtual unsigned int getBufferSize() const = 0; michael@0: virtual bool setSize(unsigned int bufferSize, GLenum indexType) = 0; michael@0: michael@0: unsigned int getSerial() const; michael@0: michael@0: protected: michael@0: void updateSerial(); michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(IndexBuffer); michael@0: michael@0: unsigned int mSerial; michael@0: static unsigned int mNextSerial; michael@0: }; michael@0: michael@0: class IndexBufferInterface michael@0: { michael@0: public: michael@0: IndexBufferInterface(Renderer *renderer, bool dynamic); michael@0: virtual ~IndexBufferInterface(); michael@0: michael@0: virtual bool reserveBufferSpace(unsigned int size, GLenum indexType) = 0; michael@0: michael@0: GLenum getIndexType() const; michael@0: unsigned int getBufferSize() const; michael@0: michael@0: unsigned int getSerial() const; michael@0: michael@0: bool mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset); michael@0: bool unmapBuffer(); michael@0: michael@0: IndexBuffer *getIndexBuffer() const; michael@0: michael@0: protected: michael@0: unsigned int getWritePosition() const; michael@0: void setWritePosition(unsigned int writePosition); michael@0: michael@0: bool discard(); michael@0: michael@0: bool setBufferSize(unsigned int bufferSize, GLenum indexType); michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(IndexBufferInterface); michael@0: michael@0: rx::Renderer *const mRenderer; michael@0: michael@0: IndexBuffer* mIndexBuffer; michael@0: michael@0: unsigned int mWritePosition; michael@0: bool mDynamic; michael@0: }; michael@0: michael@0: class StreamingIndexBufferInterface : public IndexBufferInterface michael@0: { michael@0: public: michael@0: StreamingIndexBufferInterface(Renderer *renderer); michael@0: ~StreamingIndexBufferInterface(); michael@0: michael@0: virtual bool reserveBufferSpace(unsigned int size, GLenum indexType); michael@0: }; michael@0: michael@0: class StaticIndexBufferInterface : public IndexBufferInterface michael@0: { michael@0: public: michael@0: explicit StaticIndexBufferInterface(Renderer *renderer); michael@0: ~StaticIndexBufferInterface(); michael@0: michael@0: virtual bool reserveBufferSpace(unsigned int size, GLenum indexType); michael@0: michael@0: IndexRangeCache *getIndexRangeCache(); michael@0: michael@0: private: michael@0: IndexRangeCache mIndexRangeCache; michael@0: }; michael@0: michael@0: } michael@0: michael@0: #endif // LIBGLESV2_RENDERER_INDEXBUFFER_H_