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 LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ 11 #define LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ 12 13 #include "common/angleutils.h" 14 #include "libANGLE/Error.h" 15 16 namespace rx 17 { 18 class BufferFactoryD3D; 19 20 class IndexBuffer : angle::NonCopyable 21 { 22 public: 23 IndexBuffer(); 24 virtual ~IndexBuffer(); 25 26 virtual gl::Error initialize(unsigned int bufferSize, GLenum indexType, bool dynamic) = 0; 27 28 virtual gl::Error mapBuffer(unsigned int offset, unsigned int size, void** outMappedMemory) = 0; 29 virtual gl::Error unmapBuffer() = 0; 30 31 virtual gl::Error discard() = 0; 32 33 virtual GLenum getIndexType() const = 0; 34 virtual unsigned int getBufferSize() const = 0; 35 virtual gl::Error setSize(unsigned int bufferSize, GLenum indexType) = 0; 36 37 unsigned int getSerial() const; 38 39 protected: 40 void updateSerial(); 41 42 private: 43 unsigned int mSerial; 44 static unsigned int mNextSerial; 45 }; 46 47 class IndexBufferInterface : angle::NonCopyable 48 { 49 public: 50 IndexBufferInterface(BufferFactoryD3D *factory, bool dynamic); 51 virtual ~IndexBufferInterface(); 52 53 virtual gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) = 0; 54 55 GLenum getIndexType() const; 56 unsigned int getBufferSize() const; 57 58 unsigned int getSerial() const; 59 60 gl::Error mapBuffer(unsigned int size, void** outMappedMemory, unsigned int *streamOffset); 61 gl::Error unmapBuffer(); 62 63 IndexBuffer *getIndexBuffer() const; 64 65 protected: 66 unsigned int getWritePosition() const; 67 void setWritePosition(unsigned int writePosition); 68 69 gl::Error discard(); 70 71 gl::Error setBufferSize(unsigned int bufferSize, GLenum indexType); 72 73 private: 74 IndexBuffer *mIndexBuffer; 75 76 unsigned int mWritePosition; 77 bool mDynamic; 78 }; 79 80 class StreamingIndexBufferInterface : public IndexBufferInterface 81 { 82 public: 83 explicit StreamingIndexBufferInterface(BufferFactoryD3D *factory); 84 ~StreamingIndexBufferInterface() override; 85 86 gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) override; 87 }; 88 89 class StaticIndexBufferInterface : public IndexBufferInterface 90 { 91 public: 92 explicit StaticIndexBufferInterface(BufferFactoryD3D *factory); 93 ~StaticIndexBufferInterface() override; 94 95 gl::Error reserveBufferSpace(unsigned int size, GLenum indexType) override; 96 }; 97 98 } 99 100 #endif // LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ 101