1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2002 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker // VertexBuffer.h: Defines the abstract VertexBuffer class and VertexBufferInterface 8*8975f5c5SAndroid Build Coastguard Worker // class with derivations, classes that perform graphics API agnostic vertex buffer operations. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "common/PackedEnums.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Error.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/Format.h" 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker #include <GLES2/gl2.h> 19*8975f5c5SAndroid Build Coastguard Worker 20*8975f5c5SAndroid Build Coastguard Worker #include <cstddef> 21*8975f5c5SAndroid Build Coastguard Worker #include <cstdint> 22*8975f5c5SAndroid Build Coastguard Worker #include <vector> 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker namespace gl 25*8975f5c5SAndroid Build Coastguard Worker { 26*8975f5c5SAndroid Build Coastguard Worker class Context; 27*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribute; 28*8975f5c5SAndroid Build Coastguard Worker class VertexBinding; 29*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribCurrentValueData; 30*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 31*8975f5c5SAndroid Build Coastguard Worker 32*8975f5c5SAndroid Build Coastguard Worker namespace rx 33*8975f5c5SAndroid Build Coastguard Worker { 34*8975f5c5SAndroid Build Coastguard Worker class BufferFactoryD3D; 35*8975f5c5SAndroid Build Coastguard Worker 36*8975f5c5SAndroid Build Coastguard Worker // Use a ref-counting scheme with self-deletion on release. We do this so that we can more 37*8975f5c5SAndroid Build Coastguard Worker // easily manage the static buffer cache, without deleting currently bound buffers. 38*8975f5c5SAndroid Build Coastguard Worker class VertexBuffer : angle::NonCopyable 39*8975f5c5SAndroid Build Coastguard Worker { 40*8975f5c5SAndroid Build Coastguard Worker public: 41*8975f5c5SAndroid Build Coastguard Worker VertexBuffer(); 42*8975f5c5SAndroid Build Coastguard Worker 43*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result initialize(const gl::Context *context, 44*8975f5c5SAndroid Build Coastguard Worker unsigned int size, 45*8975f5c5SAndroid Build Coastguard Worker bool dynamicUsage) = 0; 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard Worker // Warning: you should ensure binding really matches attrib.bindingIndex before using this 48*8975f5c5SAndroid Build Coastguard Worker // function. 49*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result storeVertexAttributes(const gl::Context *context, 50*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 51*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 52*8975f5c5SAndroid Build Coastguard Worker gl::VertexAttribType currentValueType, 53*8975f5c5SAndroid Build Coastguard Worker GLint start, 54*8975f5c5SAndroid Build Coastguard Worker size_t count, 55*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 56*8975f5c5SAndroid Build Coastguard Worker unsigned int offset, 57*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData) = 0; 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker virtual unsigned int getBufferSize() const = 0; 60*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result setBufferSize(const gl::Context *context, unsigned int size) = 0; 61*8975f5c5SAndroid Build Coastguard Worker virtual angle::Result discard(const gl::Context *context) = 0; 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker unsigned int getSerial() const; 64*8975f5c5SAndroid Build Coastguard Worker 65*8975f5c5SAndroid Build Coastguard Worker // This may be overridden (e.g. by VertexBuffer11) if necessary. hintUnmapResource()66*8975f5c5SAndroid Build Coastguard Worker virtual void hintUnmapResource() {} 67*8975f5c5SAndroid Build Coastguard Worker 68*8975f5c5SAndroid Build Coastguard Worker // Reference counting. 69*8975f5c5SAndroid Build Coastguard Worker void addRef(); 70*8975f5c5SAndroid Build Coastguard Worker void release(); 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker protected: 73*8975f5c5SAndroid Build Coastguard Worker void updateSerial(); 74*8975f5c5SAndroid Build Coastguard Worker virtual ~VertexBuffer(); 75*8975f5c5SAndroid Build Coastguard Worker 76*8975f5c5SAndroid Build Coastguard Worker private: 77*8975f5c5SAndroid Build Coastguard Worker unsigned int mSerial; 78*8975f5c5SAndroid Build Coastguard Worker static unsigned int mNextSerial; 79*8975f5c5SAndroid Build Coastguard Worker unsigned int mRefCount; 80*8975f5c5SAndroid Build Coastguard Worker }; 81*8975f5c5SAndroid Build Coastguard Worker 82*8975f5c5SAndroid Build Coastguard Worker class VertexBufferInterface : angle::NonCopyable 83*8975f5c5SAndroid Build Coastguard Worker { 84*8975f5c5SAndroid Build Coastguard Worker public: 85*8975f5c5SAndroid Build Coastguard Worker VertexBufferInterface(BufferFactoryD3D *factory, bool dynamic); 86*8975f5c5SAndroid Build Coastguard Worker virtual ~VertexBufferInterface(); 87*8975f5c5SAndroid Build Coastguard Worker 88*8975f5c5SAndroid Build Coastguard Worker unsigned int getBufferSize() const; empty()89*8975f5c5SAndroid Build Coastguard Worker bool empty() const { return getBufferSize() == 0; } 90*8975f5c5SAndroid Build Coastguard Worker 91*8975f5c5SAndroid Build Coastguard Worker unsigned int getSerial() const; 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker VertexBuffer *getVertexBuffer() const; 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker protected: 96*8975f5c5SAndroid Build Coastguard Worker angle::Result discard(const gl::Context *context); 97*8975f5c5SAndroid Build Coastguard Worker 98*8975f5c5SAndroid Build Coastguard Worker angle::Result setBufferSize(const gl::Context *context, unsigned int size); 99*8975f5c5SAndroid Build Coastguard Worker 100*8975f5c5SAndroid Build Coastguard Worker angle::Result getSpaceRequired(const gl::Context *context, 101*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 102*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 103*8975f5c5SAndroid Build Coastguard Worker size_t count, 104*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 105*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance, 106*8975f5c5SAndroid Build Coastguard Worker unsigned int *spaceInBytesOut) const; 107*8975f5c5SAndroid Build Coastguard Worker BufferFactoryD3D *const mFactory; 108*8975f5c5SAndroid Build Coastguard Worker VertexBuffer *mVertexBuffer; 109*8975f5c5SAndroid Build Coastguard Worker bool mDynamic; 110*8975f5c5SAndroid Build Coastguard Worker }; 111*8975f5c5SAndroid Build Coastguard Worker 112*8975f5c5SAndroid Build Coastguard Worker class StreamingVertexBufferInterface : public VertexBufferInterface 113*8975f5c5SAndroid Build Coastguard Worker { 114*8975f5c5SAndroid Build Coastguard Worker public: 115*8975f5c5SAndroid Build Coastguard Worker StreamingVertexBufferInterface(BufferFactoryD3D *factory); 116*8975f5c5SAndroid Build Coastguard Worker ~StreamingVertexBufferInterface() override; 117*8975f5c5SAndroid Build Coastguard Worker 118*8975f5c5SAndroid Build Coastguard Worker angle::Result initialize(const gl::Context *context, std::size_t initialSize); 119*8975f5c5SAndroid Build Coastguard Worker void reset(); 120*8975f5c5SAndroid Build Coastguard Worker 121*8975f5c5SAndroid Build Coastguard Worker angle::Result storeDynamicAttribute(const gl::Context *context, 122*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 123*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 124*8975f5c5SAndroid Build Coastguard Worker gl::VertexAttribType currentValueType, 125*8975f5c5SAndroid Build Coastguard Worker GLint start, 126*8975f5c5SAndroid Build Coastguard Worker size_t count, 127*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 128*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance, 129*8975f5c5SAndroid Build Coastguard Worker unsigned int *outStreamOffset, 130*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData); 131*8975f5c5SAndroid Build Coastguard Worker 132*8975f5c5SAndroid Build Coastguard Worker angle::Result reserveVertexSpace(const gl::Context *context, 133*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attribute, 134*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 135*8975f5c5SAndroid Build Coastguard Worker size_t count, 136*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 137*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance); 138*8975f5c5SAndroid Build Coastguard Worker 139*8975f5c5SAndroid Build Coastguard Worker private: 140*8975f5c5SAndroid Build Coastguard Worker angle::Result reserveSpace(const gl::Context *context, unsigned int size); 141*8975f5c5SAndroid Build Coastguard Worker 142*8975f5c5SAndroid Build Coastguard Worker unsigned int mWritePosition; 143*8975f5c5SAndroid Build Coastguard Worker unsigned int mReservedSpace; 144*8975f5c5SAndroid Build Coastguard Worker }; 145*8975f5c5SAndroid Build Coastguard Worker 146*8975f5c5SAndroid Build Coastguard Worker class StaticVertexBufferInterface : public VertexBufferInterface 147*8975f5c5SAndroid Build Coastguard Worker { 148*8975f5c5SAndroid Build Coastguard Worker public: 149*8975f5c5SAndroid Build Coastguard Worker explicit StaticVertexBufferInterface(BufferFactoryD3D *factory); 150*8975f5c5SAndroid Build Coastguard Worker ~StaticVertexBufferInterface() override; 151*8975f5c5SAndroid Build Coastguard Worker 152*8975f5c5SAndroid Build Coastguard Worker // Warning: you should ensure binding really matches attrib.bindingIndex before using these 153*8975f5c5SAndroid Build Coastguard Worker // functions. 154*8975f5c5SAndroid Build Coastguard Worker angle::Result storeStaticAttribute(const gl::Context *context, 155*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 156*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 157*8975f5c5SAndroid Build Coastguard Worker GLint start, 158*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 159*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 160*8975f5c5SAndroid Build Coastguard Worker const uint8_t *sourceData); 161*8975f5c5SAndroid Build Coastguard Worker 162*8975f5c5SAndroid Build Coastguard Worker bool matchesAttribute(const gl::VertexAttribute &attribute, 163*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding) const; 164*8975f5c5SAndroid Build Coastguard Worker 165*8975f5c5SAndroid Build Coastguard Worker void setAttribute(const gl::VertexAttribute &attribute, const gl::VertexBinding &binding); 166*8975f5c5SAndroid Build Coastguard Worker 167*8975f5c5SAndroid Build Coastguard Worker private: 168*8975f5c5SAndroid Build Coastguard Worker class AttributeSignature final : angle::NonCopyable 169*8975f5c5SAndroid Build Coastguard Worker { 170*8975f5c5SAndroid Build Coastguard Worker public: 171*8975f5c5SAndroid Build Coastguard Worker AttributeSignature(); 172*8975f5c5SAndroid Build Coastguard Worker 173*8975f5c5SAndroid Build Coastguard Worker bool matchesAttribute(const gl::VertexAttribute &attrib, 174*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding) const; 175*8975f5c5SAndroid Build Coastguard Worker 176*8975f5c5SAndroid Build Coastguard Worker void set(const gl::VertexAttribute &attrib, const gl::VertexBinding &binding); 177*8975f5c5SAndroid Build Coastguard Worker 178*8975f5c5SAndroid Build Coastguard Worker private: 179*8975f5c5SAndroid Build Coastguard Worker angle::FormatID formatID; 180*8975f5c5SAndroid Build Coastguard Worker GLuint stride; 181*8975f5c5SAndroid Build Coastguard Worker size_t offset; 182*8975f5c5SAndroid Build Coastguard Worker }; 183*8975f5c5SAndroid Build Coastguard Worker 184*8975f5c5SAndroid Build Coastguard Worker AttributeSignature mSignature; 185*8975f5c5SAndroid Build Coastguard Worker }; 186*8975f5c5SAndroid Build Coastguard Worker 187*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 188*8975f5c5SAndroid Build Coastguard Worker 189*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_D3D_VERTEXBUFFER_H_ 190