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 // VertexBuffer.h: Defines the abstract VertexBuffer class and VertexBufferInterface 8 // class with derivations, classes that perform graphics API agnostic vertex buffer operations. 9 10 #ifndef LIBGLESV2_RENDERER_VERTEXBUFFER_H_ 11 #define LIBGLESV2_RENDERER_VERTEXBUFFER_H_ 12 13 #include "common/angleutils.h" 14 15 namespace gl 16 { 17 class VertexAttribute; 18 } 19 20 namespace rx 21 { 22 class Renderer; 23 24 class VertexBuffer 25 { 26 public: 27 VertexBuffer(); 28 virtual ~VertexBuffer(); 29 30 virtual bool initialize(unsigned int size, bool dynamicUsage) = 0; 31 32 virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, 33 GLsizei instances, unsigned int offset) = 0; 34 virtual bool storeRawData(const void* data, unsigned int size, unsigned int offset) = 0; 35 36 virtual bool getSpaceRequired(const gl::VertexAttribute &attrib, GLsizei count, GLsizei instances, 37 unsigned int *outSpaceRequired) const = 0; 38 39 virtual bool requiresConversion(const gl::VertexAttribute &attrib) const = 0; 40 41 virtual unsigned int getBufferSize() const = 0; 42 virtual bool setBufferSize(unsigned int size) = 0; 43 virtual bool discard() = 0; 44 45 unsigned int getSerial() const; 46 47 protected: 48 void updateSerial(); 49 50 private: 51 DISALLOW_COPY_AND_ASSIGN(VertexBuffer); 52 53 unsigned int mSerial; 54 static unsigned int mNextSerial; 55 }; 56 57 class VertexBufferInterface 58 { 59 public: 60 VertexBufferInterface(rx::Renderer *renderer, bool dynamic); 61 virtual ~VertexBufferInterface(); 62 63 bool reserveVertexSpace(const gl::VertexAttribute &attribute, GLsizei count, GLsizei instances); 64 bool reserveRawDataSpace(unsigned int size); 65 66 unsigned int getBufferSize() const; 67 68 unsigned int getSerial() const; 69 70 virtual bool storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, GLsizei instances, 71 unsigned int *outStreamOffset); 72 virtual bool storeRawData(const void* data, unsigned int size, unsigned int *outStreamOffset); 73 74 VertexBuffer* getVertexBuffer() const; 75 76 protected: 77 virtual bool reserveSpace(unsigned int size) = 0; 78 79 unsigned int getWritePosition() const; 80 void setWritePosition(unsigned int writePosition); 81 82 bool discard(); 83 84 bool setBufferSize(unsigned int size); 85 86 private: 87 DISALLOW_COPY_AND_ASSIGN(VertexBufferInterface); 88 89 rx::Renderer *const mRenderer; 90 91 VertexBuffer* mVertexBuffer; 92 93 unsigned int mWritePosition; 94 unsigned int mReservedSpace; 95 bool mDynamic; 96 }; 97 98 class StreamingVertexBufferInterface : public VertexBufferInterface 99 { 100 public: 101 StreamingVertexBufferInterface(rx::Renderer *renderer, std::size_t initialSize); 102 ~StreamingVertexBufferInterface(); 103 104 protected: 105 bool reserveSpace(unsigned int size); 106 }; 107 108 class StaticVertexBufferInterface : public VertexBufferInterface 109 { 110 public: 111 explicit StaticVertexBufferInterface(rx::Renderer *renderer); 112 ~StaticVertexBufferInterface(); 113 114 bool storeVertexAttributes(const gl::VertexAttribute &attrib, GLint start, GLsizei count, GLsizei instances, 115 unsigned int *outStreamOffset); 116 117 bool lookupAttribute(const gl::VertexAttribute &attribute, unsigned int* outStreamOffset); 118 119 protected: 120 bool reserveSpace(unsigned int size); 121 122 private: 123 struct VertexElement 124 { 125 GLenum type; 126 GLint size; 127 GLsizei stride; 128 bool normalized; 129 int attributeOffset; 130 131 unsigned int streamOffset; 132 }; 133 134 std::vector<VertexElement> mCache; 135 }; 136 137 } 138 139 #endif // LIBGLESV2_RENDERER_VERTEXBUFFER_H_