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: // VertexBuffer.h: Defines the abstract VertexBuffer class and VertexBufferInterface michael@0: // class with derivations, classes that perform graphics API agnostic vertex buffer operations. michael@0: michael@0: #ifndef LIBGLESV2_RENDERER_VERTEXBUFFER_H_ michael@0: #define LIBGLESV2_RENDERER_VERTEXBUFFER_H_ michael@0: michael@0: #include "common/angleutils.h" michael@0: michael@0: namespace gl michael@0: { michael@0: class VertexAttribute; michael@0: } michael@0: michael@0: namespace rx michael@0: { michael@0: class Renderer; michael@0: michael@0: class VertexBuffer michael@0: { michael@0: public: michael@0: VertexBuffer(); michael@0: virtual ~VertexBuffer(); michael@0: michael@0: virtual bool initialize(unsigned int size, bool dynamicUsage) = 0; michael@0: michael@0: virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, michael@0: GLsizei instances, unsigned int offset) = 0; michael@0: virtual bool storeRawData(const void* data, unsigned int size, unsigned int offset) = 0; michael@0: michael@0: virtual bool getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, michael@0: unsigned int *outSpaceRequired) const = 0; michael@0: michael@0: virtual bool requiresConversion(const gl::VertexAttribute &attrib) const = 0; michael@0: michael@0: virtual unsigned int getBufferSize() const = 0; michael@0: virtual bool setBufferSize(unsigned int size) = 0; michael@0: virtual bool discard() = 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(VertexBuffer); michael@0: michael@0: unsigned int mSerial; michael@0: static unsigned int mNextSerial; michael@0: }; michael@0: michael@0: class VertexBufferInterface michael@0: { michael@0: public: michael@0: VertexBufferInterface(rx::Renderer *renderer, bool dynamic); michael@0: virtual ~VertexBufferInterface(); michael@0: michael@0: bool reserveVertexSpace(const gl::VertexAttribute &attribute, GLsizei count, GLsizei instances); michael@0: bool reserveRawDataSpace(unsigned int size); michael@0: michael@0: unsigned int getBufferSize() const; michael@0: michael@0: unsigned int getSerial() const; michael@0: michael@0: virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, GLsizei instances, michael@0: unsigned int *outStreamOffset); michael@0: virtual bool storeRawData(const void* data, unsigned int size, unsigned int *outStreamOffset); michael@0: michael@0: VertexBuffer* getVertexBuffer() const; michael@0: michael@0: protected: michael@0: virtual bool reserveSpace(unsigned int size) = 0; michael@0: 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 size); michael@0: michael@0: private: michael@0: DISALLOW_COPY_AND_ASSIGN(VertexBufferInterface); michael@0: michael@0: rx::Renderer *const mRenderer; michael@0: michael@0: VertexBuffer* mVertexBuffer; michael@0: michael@0: unsigned int mWritePosition; michael@0: unsigned int mReservedSpace; michael@0: bool mDynamic; michael@0: }; michael@0: michael@0: class StreamingVertexBufferInterface : public VertexBufferInterface michael@0: { michael@0: public: michael@0: StreamingVertexBufferInterface(rx::Renderer *renderer, std::size_t initialSize); michael@0: ~StreamingVertexBufferInterface(); michael@0: michael@0: protected: michael@0: bool reserveSpace(unsigned int size); michael@0: }; michael@0: michael@0: class StaticVertexBufferInterface : public VertexBufferInterface michael@0: { michael@0: public: michael@0: explicit StaticVertexBufferInterface(rx::Renderer *renderer); michael@0: ~StaticVertexBufferInterface(); michael@0: michael@0: bool storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, GLsizei instances, michael@0: unsigned int *outStreamOffset); michael@0: michael@0: bool lookupAttribute(const gl::VertexAttribute &attribute, unsigned int* outStreamOffset); michael@0: michael@0: protected: michael@0: bool reserveSpace(unsigned int size); michael@0: michael@0: private: michael@0: struct VertexElement michael@0: { michael@0: GLenum type; michael@0: GLint size; michael@0: GLsizei stride; michael@0: bool normalized; michael@0: int attributeOffset; michael@0: michael@0: unsigned int streamOffset; michael@0: }; michael@0: michael@0: std::vector mCache; michael@0: }; michael@0: michael@0: } michael@0: michael@0: #endif // LIBGLESV2_RENDERER_VERTEXBUFFER_H_