| // | |
| // Copyright 2002 The ANGLE Project Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| // | |
| // IndexBuffer.h: Defines the abstract IndexBuffer class and IndexBufferInterface | |
| // class with derivations, classes that perform graphics API agnostic index buffer operations. | |
| #ifndef LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ | |
| #define LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ | |
| #include "common/PackedEnums.h" | |
| #include "common/angleutils.h" | |
| #include "libANGLE/Error.h" | |
| namespace gl | |
| { | |
| class Context; | |
| } // namespace gl | |
| namespace rx | |
| { | |
| class BufferFactoryD3D; | |
| class IndexBuffer : angle::NonCopyable | |
| { | |
| public: | |
| IndexBuffer(); | |
| virtual ~IndexBuffer(); | |
| virtual angle::Result initialize(const gl::Context *context, | |
| unsigned int bufferSize, | |
| gl::DrawElementsType indexType, | |
| bool dynamic) = 0; | |
| virtual angle::Result mapBuffer(const gl::Context *context, | |
| unsigned int offset, | |
| unsigned int size, | |
| void **outMappedMemory) = 0; | |
| virtual angle::Result unmapBuffer(const gl::Context *context) = 0; | |
| virtual angle::Result discard(const gl::Context *context) = 0; | |
| virtual gl::DrawElementsType getIndexType() const = 0; | |
| virtual unsigned int getBufferSize() const = 0; | |
| virtual angle::Result setSize(const gl::Context *context, | |
| unsigned int bufferSize, | |
| gl::DrawElementsType indexType) = 0; | |
| unsigned int getSerial() const; | |
| protected: | |
| void updateSerial(); | |
| private: | |
| unsigned int mSerial; | |
| static unsigned int mNextSerial; | |
| }; | |
| class IndexBufferInterface : angle::NonCopyable | |
| { | |
| public: | |
| IndexBufferInterface(BufferFactoryD3D *factory, bool dynamic); | |
| virtual ~IndexBufferInterface(); | |
| virtual angle::Result reserveBufferSpace(const gl::Context *context, | |
| unsigned int size, | |
| gl::DrawElementsType indexType) = 0; | |
| gl::DrawElementsType getIndexType() const; | |
| unsigned int getBufferSize() const; | |
| unsigned int getSerial() const; | |
| angle::Result mapBuffer(const gl::Context *context, | |
| unsigned int size, | |
| void **outMappedMemory, | |
| unsigned int *streamOffset); | |
| angle::Result unmapBuffer(const gl::Context *context); | |
| IndexBuffer *getIndexBuffer() const; | |
| protected: | |
| unsigned int getWritePosition() const; | |
| void setWritePosition(unsigned int writePosition); | |
| angle::Result discard(const gl::Context *context); | |
| angle::Result setBufferSize(const gl::Context *context, | |
| unsigned int bufferSize, | |
| gl::DrawElementsType indexType); | |
| private: | |
| IndexBuffer *mIndexBuffer; | |
| unsigned int mWritePosition; | |
| bool mDynamic; | |
| }; | |
| class StreamingIndexBufferInterface : public IndexBufferInterface | |
| { | |
| public: | |
| explicit StreamingIndexBufferInterface(BufferFactoryD3D *factory); | |
| ~StreamingIndexBufferInterface() override; | |
| angle::Result reserveBufferSpace(const gl::Context *context, | |
| unsigned int size, | |
| gl::DrawElementsType indexType) override; | |
| }; | |
| class StaticIndexBufferInterface : public IndexBufferInterface | |
| { | |
| public: | |
| explicit StaticIndexBufferInterface(BufferFactoryD3D *factory); | |
| ~StaticIndexBufferInterface() override; | |
| angle::Result reserveBufferSpace(const gl::Context *context, | |
| unsigned int size, | |
| gl::DrawElementsType indexType) override; | |
| }; | |
| } // namespace rx | |
| #endif // LIBANGLE_RENDERER_D3D_INDEXBUFFER_H_ |