Home | History | Annotate | Download | only in renderer
      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_