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 // VertexDataManager.h: Defines the VertexDataManager, a class that 8*8975f5c5SAndroid Build Coastguard Worker // runs the Buffer translation process. 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "common/angleutils.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/Constants.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/VertexAttribute.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/angletypes.h" 17*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/d3d/VertexBuffer.h" 18*8975f5c5SAndroid Build Coastguard Worker 19*8975f5c5SAndroid Build Coastguard Worker namespace gl 20*8975f5c5SAndroid Build Coastguard Worker { 21*8975f5c5SAndroid Build Coastguard Worker class State; 22*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribute; 23*8975f5c5SAndroid Build Coastguard Worker class VertexBinding; 24*8975f5c5SAndroid Build Coastguard Worker struct VertexAttribCurrentValueData; 25*8975f5c5SAndroid Build Coastguard Worker } // namespace gl 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker namespace rx 28*8975f5c5SAndroid Build Coastguard Worker { 29*8975f5c5SAndroid Build Coastguard Worker class BufferD3D; 30*8975f5c5SAndroid Build Coastguard Worker class BufferFactoryD3D; 31*8975f5c5SAndroid Build Coastguard Worker class StreamingVertexBufferInterface; 32*8975f5c5SAndroid Build Coastguard Worker class VertexBuffer; 33*8975f5c5SAndroid Build Coastguard Worker 34*8975f5c5SAndroid Build Coastguard Worker class VertexBufferBinding final 35*8975f5c5SAndroid Build Coastguard Worker { 36*8975f5c5SAndroid Build Coastguard Worker public: 37*8975f5c5SAndroid Build Coastguard Worker VertexBufferBinding(); 38*8975f5c5SAndroid Build Coastguard Worker VertexBufferBinding(const VertexBufferBinding &other); 39*8975f5c5SAndroid Build Coastguard Worker ~VertexBufferBinding(); 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker void set(VertexBuffer *vertexBuffer); 42*8975f5c5SAndroid Build Coastguard Worker VertexBuffer *get() const; 43*8975f5c5SAndroid Build Coastguard Worker VertexBufferBinding &operator=(const VertexBufferBinding &other); 44*8975f5c5SAndroid Build Coastguard Worker 45*8975f5c5SAndroid Build Coastguard Worker private: 46*8975f5c5SAndroid Build Coastguard Worker VertexBuffer *mBoundVertexBuffer; 47*8975f5c5SAndroid Build Coastguard Worker }; 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker struct TranslatedAttribute 50*8975f5c5SAndroid Build Coastguard Worker { 51*8975f5c5SAndroid Build Coastguard Worker TranslatedAttribute(); 52*8975f5c5SAndroid Build Coastguard Worker TranslatedAttribute(const TranslatedAttribute &other); 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker // Computes the correct offset from baseOffset, usesFirstVertexOffset, stride and startVertex. 55*8975f5c5SAndroid Build Coastguard Worker // Can throw an error on integer overflow. 56*8975f5c5SAndroid Build Coastguard Worker angle::Result computeOffset(const gl::Context *context, 57*8975f5c5SAndroid Build Coastguard Worker GLint startVertex, 58*8975f5c5SAndroid Build Coastguard Worker unsigned int *offsetOut) const; 59*8975f5c5SAndroid Build Coastguard Worker 60*8975f5c5SAndroid Build Coastguard Worker bool active; 61*8975f5c5SAndroid Build Coastguard Worker 62*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute *attribute; 63*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding *binding; 64*8975f5c5SAndroid Build Coastguard Worker gl::VertexAttribType currentValueType; 65*8975f5c5SAndroid Build Coastguard Worker unsigned int baseOffset; 66*8975f5c5SAndroid Build Coastguard Worker bool usesFirstVertexOffset; 67*8975f5c5SAndroid Build Coastguard Worker unsigned int stride; // 0 means not to advance the read pointer at all 68*8975f5c5SAndroid Build Coastguard Worker 69*8975f5c5SAndroid Build Coastguard Worker VertexBufferBinding vertexBuffer; 70*8975f5c5SAndroid Build Coastguard Worker BufferD3D *storage; 71*8975f5c5SAndroid Build Coastguard Worker unsigned int serial; 72*8975f5c5SAndroid Build Coastguard Worker unsigned int divisor; 73*8975f5c5SAndroid Build Coastguard Worker }; 74*8975f5c5SAndroid Build Coastguard Worker 75*8975f5c5SAndroid Build Coastguard Worker enum class VertexStorageType 76*8975f5c5SAndroid Build Coastguard Worker { 77*8975f5c5SAndroid Build Coastguard Worker UNKNOWN, 78*8975f5c5SAndroid Build Coastguard Worker STATIC, // Translate the vertex data once and re-use it. 79*8975f5c5SAndroid Build Coastguard Worker DYNAMIC, // Translate the data every frame into a ring buffer. 80*8975f5c5SAndroid Build Coastguard Worker DIRECT, // Bind a D3D buffer directly without any translation. 81*8975f5c5SAndroid Build Coastguard Worker CURRENT_VALUE, // Use a single value for the attribute. 82*8975f5c5SAndroid Build Coastguard Worker }; 83*8975f5c5SAndroid Build Coastguard Worker 84*8975f5c5SAndroid Build Coastguard Worker // Given a vertex attribute, return the type of storage it will use. 85*8975f5c5SAndroid Build Coastguard Worker VertexStorageType ClassifyAttributeStorage(const gl::Context *context, 86*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 87*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding); 88*8975f5c5SAndroid Build Coastguard Worker 89*8975f5c5SAndroid Build Coastguard Worker class VertexDataManager : angle::NonCopyable 90*8975f5c5SAndroid Build Coastguard Worker { 91*8975f5c5SAndroid Build Coastguard Worker public: 92*8975f5c5SAndroid Build Coastguard Worker VertexDataManager(BufferFactoryD3D *factory); 93*8975f5c5SAndroid Build Coastguard Worker virtual ~VertexDataManager(); 94*8975f5c5SAndroid Build Coastguard Worker 95*8975f5c5SAndroid Build Coastguard Worker angle::Result initialize(const gl::Context *context); 96*8975f5c5SAndroid Build Coastguard Worker void deinitialize(); 97*8975f5c5SAndroid Build Coastguard Worker 98*8975f5c5SAndroid Build Coastguard Worker angle::Result prepareVertexData(const gl::Context *context, 99*8975f5c5SAndroid Build Coastguard Worker GLint start, 100*8975f5c5SAndroid Build Coastguard Worker GLsizei count, 101*8975f5c5SAndroid Build Coastguard Worker std::vector<TranslatedAttribute> *translatedAttribs, 102*8975f5c5SAndroid Build Coastguard Worker GLsizei instances); 103*8975f5c5SAndroid Build Coastguard Worker 104*8975f5c5SAndroid Build Coastguard Worker static void StoreDirectAttrib(const gl::Context *context, TranslatedAttribute *directAttrib); 105*8975f5c5SAndroid Build Coastguard Worker 106*8975f5c5SAndroid Build Coastguard Worker static angle::Result StoreStaticAttrib(const gl::Context *context, 107*8975f5c5SAndroid Build Coastguard Worker TranslatedAttribute *translated); 108*8975f5c5SAndroid Build Coastguard Worker 109*8975f5c5SAndroid Build Coastguard Worker angle::Result storeDynamicAttribs(const gl::Context *context, 110*8975f5c5SAndroid Build Coastguard Worker std::vector<TranslatedAttribute> *translatedAttribs, 111*8975f5c5SAndroid Build Coastguard Worker const gl::AttributesMask &dynamicAttribsMask, 112*8975f5c5SAndroid Build Coastguard Worker GLint start, 113*8975f5c5SAndroid Build Coastguard Worker size_t count, 114*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 115*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance); 116*8975f5c5SAndroid Build Coastguard Worker 117*8975f5c5SAndroid Build Coastguard Worker // Promote static usage of dynamic buffers. 118*8975f5c5SAndroid Build Coastguard Worker static void PromoteDynamicAttribs(const gl::Context *context, 119*8975f5c5SAndroid Build Coastguard Worker const std::vector<TranslatedAttribute> &translatedAttribs, 120*8975f5c5SAndroid Build Coastguard Worker const gl::AttributesMask &dynamicAttribsMask, 121*8975f5c5SAndroid Build Coastguard Worker size_t count); 122*8975f5c5SAndroid Build Coastguard Worker 123*8975f5c5SAndroid Build Coastguard Worker angle::Result storeCurrentValue(const gl::Context *context, 124*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribCurrentValueData ¤tValue, 125*8975f5c5SAndroid Build Coastguard Worker TranslatedAttribute *translated, 126*8975f5c5SAndroid Build Coastguard Worker size_t attribIndex); 127*8975f5c5SAndroid Build Coastguard Worker 128*8975f5c5SAndroid Build Coastguard Worker private: 129*8975f5c5SAndroid Build Coastguard Worker struct CurrentValueState final : angle::NonCopyable 130*8975f5c5SAndroid Build Coastguard Worker { 131*8975f5c5SAndroid Build Coastguard Worker CurrentValueState(BufferFactoryD3D *factory); 132*8975f5c5SAndroid Build Coastguard Worker CurrentValueState(CurrentValueState &&other); 133*8975f5c5SAndroid Build Coastguard Worker ~CurrentValueState(); 134*8975f5c5SAndroid Build Coastguard Worker 135*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<StreamingVertexBufferInterface> buffer; 136*8975f5c5SAndroid Build Coastguard Worker gl::VertexAttribCurrentValueData data; 137*8975f5c5SAndroid Build Coastguard Worker size_t offset; 138*8975f5c5SAndroid Build Coastguard Worker }; 139*8975f5c5SAndroid Build Coastguard Worker 140*8975f5c5SAndroid Build Coastguard Worker angle::Result reserveSpaceForAttrib(const gl::Context *context, 141*8975f5c5SAndroid Build Coastguard Worker const TranslatedAttribute &translatedAttrib, 142*8975f5c5SAndroid Build Coastguard Worker GLint start, 143*8975f5c5SAndroid Build Coastguard Worker size_t count, 144*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 145*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance); 146*8975f5c5SAndroid Build Coastguard Worker 147*8975f5c5SAndroid Build Coastguard Worker angle::Result storeDynamicAttrib(const gl::Context *context, 148*8975f5c5SAndroid Build Coastguard Worker TranslatedAttribute *translated, 149*8975f5c5SAndroid Build Coastguard Worker GLint start, 150*8975f5c5SAndroid Build Coastguard Worker size_t count, 151*8975f5c5SAndroid Build Coastguard Worker GLsizei instances, 152*8975f5c5SAndroid Build Coastguard Worker GLuint baseInstance); 153*8975f5c5SAndroid Build Coastguard Worker 154*8975f5c5SAndroid Build Coastguard Worker BufferFactoryD3D *const mFactory; 155*8975f5c5SAndroid Build Coastguard Worker 156*8975f5c5SAndroid Build Coastguard Worker StreamingVertexBufferInterface mStreamingBuffer; 157*8975f5c5SAndroid Build Coastguard Worker std::vector<CurrentValueState> mCurrentValueCache; 158*8975f5c5SAndroid Build Coastguard Worker gl::AttributesMask mDynamicAttribsMaskCache; 159*8975f5c5SAndroid Build Coastguard Worker }; 160*8975f5c5SAndroid Build Coastguard Worker 161*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 162*8975f5c5SAndroid Build Coastguard Worker 163*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_D3D_VERTEXDATAMANAGER_H_ 164