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