1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2016 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 // VertexArrayVk.h: 7*8975f5c5SAndroid Build Coastguard Worker // Defines the class interface for VertexArrayVk, implementing VertexArrayImpl. 8*8975f5c5SAndroid Build Coastguard Worker // 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #ifndef LIBANGLE_RENDERER_VULKAN_VERTEXARRAYVK_H_ 11*8975f5c5SAndroid Build Coastguard Worker #define LIBANGLE_RENDERER_VULKAN_VERTEXARRAYVK_H_ 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/VertexArrayImpl.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/UtilsVk.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_cache_utils.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "libANGLE/renderer/vulkan/vk_helpers.h" 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace rx 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker enum class BufferBindingDirty 21*8975f5c5SAndroid Build Coastguard Worker { 22*8975f5c5SAndroid Build Coastguard Worker No, 23*8975f5c5SAndroid Build Coastguard Worker Yes, 24*8975f5c5SAndroid Build Coastguard Worker }; 25*8975f5c5SAndroid Build Coastguard Worker 26*8975f5c5SAndroid Build Coastguard Worker struct AttributeRange 27*8975f5c5SAndroid Build Coastguard Worker { 28*8975f5c5SAndroid Build Coastguard Worker // Stream vertex attribute start pointer address. 29*8975f5c5SAndroid Build Coastguard Worker uintptr_t startAddr; 30*8975f5c5SAndroid Build Coastguard Worker // Stream vertex attribute end pointer address. 31*8975f5c5SAndroid Build Coastguard Worker uintptr_t endAddr; 32*8975f5c5SAndroid Build Coastguard Worker // Stream vertex attribute first used pointer address. 33*8975f5c5SAndroid Build Coastguard Worker // ie. startAddr + startVertex * stride. 34*8975f5c5SAndroid Build Coastguard Worker uintptr_t copyStartAddr; AttributeRangeAttributeRange35*8975f5c5SAndroid Build Coastguard Worker AttributeRange() : startAddr(0), endAddr(0), copyStartAddr(0) {} AttributeRangeAttributeRange36*8975f5c5SAndroid Build Coastguard Worker AttributeRange(uintptr_t start, uintptr_t end, uintptr_t copyStart) 37*8975f5c5SAndroid Build Coastguard Worker : startAddr(start), endAddr(end), copyStartAddr(copyStart) 38*8975f5c5SAndroid Build Coastguard Worker {} 39*8975f5c5SAndroid Build Coastguard Worker }; 40*8975f5c5SAndroid Build Coastguard Worker 41*8975f5c5SAndroid Build Coastguard Worker ANGLE_INLINE bool operator<(const AttributeRange &a, const AttributeRange &b) 42*8975f5c5SAndroid Build Coastguard Worker { 43*8975f5c5SAndroid Build Coastguard Worker return a.startAddr == b.startAddr ? a.endAddr < b.endAddr : a.startAddr < b.startAddr; 44*8975f5c5SAndroid Build Coastguard Worker } 45*8975f5c5SAndroid Build Coastguard Worker 46*8975f5c5SAndroid Build Coastguard Worker class VertexArrayVk : public VertexArrayImpl 47*8975f5c5SAndroid Build Coastguard Worker { 48*8975f5c5SAndroid Build Coastguard Worker public: 49*8975f5c5SAndroid Build Coastguard Worker VertexArrayVk(ContextVk *contextVk, const gl::VertexArrayState &state); 50*8975f5c5SAndroid Build Coastguard Worker ~VertexArrayVk() override; 51*8975f5c5SAndroid Build Coastguard Worker 52*8975f5c5SAndroid Build Coastguard Worker void destroy(const gl::Context *context) override; 53*8975f5c5SAndroid Build Coastguard Worker 54*8975f5c5SAndroid Build Coastguard Worker angle::Result syncState(const gl::Context *context, 55*8975f5c5SAndroid Build Coastguard Worker const gl::VertexArray::DirtyBits &dirtyBits, 56*8975f5c5SAndroid Build Coastguard Worker gl::VertexArray::DirtyAttribBitsArray *attribBits, 57*8975f5c5SAndroid Build Coastguard Worker gl::VertexArray::DirtyBindingBitsArray *bindingBits) override; 58*8975f5c5SAndroid Build Coastguard Worker 59*8975f5c5SAndroid Build Coastguard Worker angle::Result updateActiveAttribInfo(ContextVk *contextVk); 60*8975f5c5SAndroid Build Coastguard Worker 61*8975f5c5SAndroid Build Coastguard Worker angle::Result updateDefaultAttrib(ContextVk *contextVk, size_t attribIndex); 62*8975f5c5SAndroid Build Coastguard Worker 63*8975f5c5SAndroid Build Coastguard Worker angle::Result updateStreamedAttribs(const gl::Context *context, 64*8975f5c5SAndroid Build Coastguard Worker GLint firstVertex, 65*8975f5c5SAndroid Build Coastguard Worker GLsizei vertexOrIndexCount, 66*8975f5c5SAndroid Build Coastguard Worker GLsizei instanceCount, 67*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexTypeOrInvalid, 68*8975f5c5SAndroid Build Coastguard Worker const void *indices); 69*8975f5c5SAndroid Build Coastguard Worker 70*8975f5c5SAndroid Build Coastguard Worker angle::Result handleLineLoop(ContextVk *contextVk, 71*8975f5c5SAndroid Build Coastguard Worker GLint firstVertex, 72*8975f5c5SAndroid Build Coastguard Worker GLsizei vertexOrIndexCount, 73*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexTypeOrInvalid, 74*8975f5c5SAndroid Build Coastguard Worker const void *indices, 75*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper **indexBufferOut, 76*8975f5c5SAndroid Build Coastguard Worker uint32_t *indexCountOut); 77*8975f5c5SAndroid Build Coastguard Worker 78*8975f5c5SAndroid Build Coastguard Worker angle::Result handleLineLoopIndexIndirect(ContextVk *contextVk, 79*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType glIndexType, 80*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper *srcIndexBuffer, 81*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper *srcIndirectBuffer, 82*8975f5c5SAndroid Build Coastguard Worker VkDeviceSize indirectBufferOffset, 83*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper **indexBufferOut, 84*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper **indirectBufferOut); 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker angle::Result handleLineLoopIndirectDraw(const gl::Context *context, 87*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper *indirectBufferVk, 88*8975f5c5SAndroid Build Coastguard Worker VkDeviceSize indirectBufferOffset, 89*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper **indexBufferOut, 90*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper **indirectBufferOut); 91*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBufferHandles()92*8975f5c5SAndroid Build Coastguard Worker const gl::AttribArray<VkBuffer> &getCurrentArrayBufferHandles() const 93*8975f5c5SAndroid Build Coastguard Worker { 94*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBufferHandles; 95*8975f5c5SAndroid Build Coastguard Worker } 96*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBufferOffsets()97*8975f5c5SAndroid Build Coastguard Worker const gl::AttribArray<VkDeviceSize> &getCurrentArrayBufferOffsets() const 98*8975f5c5SAndroid Build Coastguard Worker { 99*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBufferOffsets; 100*8975f5c5SAndroid Build Coastguard Worker } 101*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBufferRelativeOffsets()102*8975f5c5SAndroid Build Coastguard Worker const gl::AttribArray<GLuint> &getCurrentArrayBufferRelativeOffsets() const 103*8975f5c5SAndroid Build Coastguard Worker { 104*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBufferRelativeOffsets; 105*8975f5c5SAndroid Build Coastguard Worker } 106*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBuffers()107*8975f5c5SAndroid Build Coastguard Worker const gl::AttribArray<vk::BufferHelper *> &getCurrentArrayBuffers() const 108*8975f5c5SAndroid Build Coastguard Worker { 109*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBuffers; 110*8975f5c5SAndroid Build Coastguard Worker } 111*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBufferFormats()112*8975f5c5SAndroid Build Coastguard Worker const gl::AttribArray<angle::FormatID> &getCurrentArrayBufferFormats() const 113*8975f5c5SAndroid Build Coastguard Worker { 114*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBufferFormats; 115*8975f5c5SAndroid Build Coastguard Worker } 116*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBufferStrides()117*8975f5c5SAndroid Build Coastguard Worker const gl::AttribArray<GLuint> &getCurrentArrayBufferStrides() const 118*8975f5c5SAndroid Build Coastguard Worker { 119*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBufferStrides; 120*8975f5c5SAndroid Build Coastguard Worker } 121*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBufferDivisors()122*8975f5c5SAndroid Build Coastguard Worker const gl::AttribArray<GLuint> &getCurrentArrayBufferDivisors() const 123*8975f5c5SAndroid Build Coastguard Worker { 124*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBufferDivisors; 125*8975f5c5SAndroid Build Coastguard Worker } 126*8975f5c5SAndroid Build Coastguard Worker getCurrentArrayBufferCompressed()127*8975f5c5SAndroid Build Coastguard Worker const gl::AttributesMask &getCurrentArrayBufferCompressed() const 128*8975f5c5SAndroid Build Coastguard Worker { 129*8975f5c5SAndroid Build Coastguard Worker return mCurrentArrayBufferCompressed; 130*8975f5c5SAndroid Build Coastguard Worker } 131*8975f5c5SAndroid Build Coastguard Worker 132*8975f5c5SAndroid Build Coastguard Worker // Update mCurrentElementArrayBuffer based on the vertex array state 133*8975f5c5SAndroid Build Coastguard Worker void updateCurrentElementArrayBuffer(); 134*8975f5c5SAndroid Build Coastguard Worker getCurrentElementArrayBuffer()135*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper *getCurrentElementArrayBuffer() const { return mCurrentElementArrayBuffer; } 136*8975f5c5SAndroid Build Coastguard Worker 137*8975f5c5SAndroid Build Coastguard Worker angle::Result convertIndexBufferGPU(ContextVk *contextVk, 138*8975f5c5SAndroid Build Coastguard Worker BufferVk *bufferVk, 139*8975f5c5SAndroid Build Coastguard Worker const void *indices); 140*8975f5c5SAndroid Build Coastguard Worker 141*8975f5c5SAndroid Build Coastguard Worker angle::Result convertIndexBufferIndirectGPU(ContextVk *contextVk, 142*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper *srcIndirectBuf, 143*8975f5c5SAndroid Build Coastguard Worker VkDeviceSize srcIndirectBufOffset, 144*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper **indirectBufferVkOut); 145*8975f5c5SAndroid Build Coastguard Worker 146*8975f5c5SAndroid Build Coastguard Worker angle::Result convertIndexBufferCPU(ContextVk *contextVk, 147*8975f5c5SAndroid Build Coastguard Worker gl::DrawElementsType indexType, 148*8975f5c5SAndroid Build Coastguard Worker size_t indexCount, 149*8975f5c5SAndroid Build Coastguard Worker const void *sourcePointer, 150*8975f5c5SAndroid Build Coastguard Worker BufferBindingDirty *bufferBindingDirty); 151*8975f5c5SAndroid Build Coastguard Worker getStreamingVertexAttribsMask()152*8975f5c5SAndroid Build Coastguard Worker const gl::AttributesMask &getStreamingVertexAttribsMask() const 153*8975f5c5SAndroid Build Coastguard Worker { 154*8975f5c5SAndroid Build Coastguard Worker return mStreamingVertexAttribsMask; 155*8975f5c5SAndroid Build Coastguard Worker } 156*8975f5c5SAndroid Build Coastguard Worker 157*8975f5c5SAndroid Build Coastguard Worker private: 158*8975f5c5SAndroid Build Coastguard Worker gl::AttributesMask mergeClientAttribsRange( 159*8975f5c5SAndroid Build Coastguard Worker vk::Renderer *renderer, 160*8975f5c5SAndroid Build Coastguard Worker const gl::AttributesMask activeStreamedAttribs, 161*8975f5c5SAndroid Build Coastguard Worker size_t startVertex, 162*8975f5c5SAndroid Build Coastguard Worker size_t endVertex, 163*8975f5c5SAndroid Build Coastguard Worker std::array<AttributeRange, gl::MAX_VERTEX_ATTRIBS> &mergeRangesOut, 164*8975f5c5SAndroid Build Coastguard Worker std::array<size_t, gl::MAX_VERTEX_ATTRIBS> &mergedIndexesOut) const; 165*8975f5c5SAndroid Build Coastguard Worker 166*8975f5c5SAndroid Build Coastguard Worker angle::Result setDefaultPackedInput(ContextVk *contextVk, 167*8975f5c5SAndroid Build Coastguard Worker size_t attribIndex, 168*8975f5c5SAndroid Build Coastguard Worker angle::FormatID *formatOut); 169*8975f5c5SAndroid Build Coastguard Worker 170*8975f5c5SAndroid Build Coastguard Worker angle::Result convertVertexBufferGPU(ContextVk *contextVk, 171*8975f5c5SAndroid Build Coastguard Worker BufferVk *srcBuffer, 172*8975f5c5SAndroid Build Coastguard Worker VertexConversionBuffer *conversion, 173*8975f5c5SAndroid Build Coastguard Worker const angle::Format &srcFormat, 174*8975f5c5SAndroid Build Coastguard Worker const angle::Format &dstFormat); 175*8975f5c5SAndroid Build Coastguard Worker angle::Result convertVertexBufferCPU(ContextVk *contextVk, 176*8975f5c5SAndroid Build Coastguard Worker BufferVk *srcBuffer, 177*8975f5c5SAndroid Build Coastguard Worker VertexConversionBuffer *conversion, 178*8975f5c5SAndroid Build Coastguard Worker const angle::Format &srcFormat, 179*8975f5c5SAndroid Build Coastguard Worker const angle::Format &dstFormat, 180*8975f5c5SAndroid Build Coastguard Worker const VertexCopyFunction vertexLoadFunction); 181*8975f5c5SAndroid Build Coastguard Worker 182*8975f5c5SAndroid Build Coastguard Worker angle::Result syncDirtyAttrib(ContextVk *contextVk, 183*8975f5c5SAndroid Build Coastguard Worker const gl::VertexAttribute &attrib, 184*8975f5c5SAndroid Build Coastguard Worker const gl::VertexBinding &binding, 185*8975f5c5SAndroid Build Coastguard Worker size_t attribIndex, 186*8975f5c5SAndroid Build Coastguard Worker bool bufferOnly); 187*8975f5c5SAndroid Build Coastguard Worker 188*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<VkBuffer> mCurrentArrayBufferHandles; 189*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<VkDeviceSize> mCurrentArrayBufferOffsets; 190*8975f5c5SAndroid Build Coastguard Worker // The offset into the buffer to the first attrib 191*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<GLuint> mCurrentArrayBufferRelativeOffsets; 192*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<vk::BufferHelper *> mCurrentArrayBuffers; 193*8975f5c5SAndroid Build Coastguard Worker // Tracks BufferSerial of mCurrentArrayBuffers since they are always valid to access. 194*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<vk::BufferSerial> mCurrentArrayBufferSerial; 195*8975f5c5SAndroid Build Coastguard Worker // Cache strides of attributes for a fast pipeline cache update when VAOs are changed 196*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<angle::FormatID> mCurrentArrayBufferFormats; 197*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<GLuint> mCurrentArrayBufferStrides; 198*8975f5c5SAndroid Build Coastguard Worker gl::AttribArray<GLuint> mCurrentArrayBufferDivisors; 199*8975f5c5SAndroid Build Coastguard Worker gl::AttributesMask mCurrentArrayBufferCompressed; 200*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelper *mCurrentElementArrayBuffer; 201*8975f5c5SAndroid Build Coastguard Worker 202*8975f5c5SAndroid Build Coastguard Worker // Cached element array buffers for improving performance. 203*8975f5c5SAndroid Build Coastguard Worker vk::BufferHelperQueue mCachedStreamIndexBuffers; 204*8975f5c5SAndroid Build Coastguard Worker 205*8975f5c5SAndroid Build Coastguard Worker ConversionBuffer mStreamedIndexData; 206*8975f5c5SAndroid Build Coastguard Worker ConversionBuffer mTranslatedByteIndexData; 207*8975f5c5SAndroid Build Coastguard Worker ConversionBuffer mTranslatedByteIndirectData; 208*8975f5c5SAndroid Build Coastguard Worker 209*8975f5c5SAndroid Build Coastguard Worker LineLoopHelper mLineLoopHelper; 210*8975f5c5SAndroid Build Coastguard Worker Optional<GLint> mLineLoopBufferFirstIndex; 211*8975f5c5SAndroid Build Coastguard Worker Optional<size_t> mLineLoopBufferLastIndex; 212*8975f5c5SAndroid Build Coastguard Worker bool mDirtyLineLoopTranslation; 213*8975f5c5SAndroid Build Coastguard Worker 214*8975f5c5SAndroid Build Coastguard Worker // Track client and/or emulated attribs that we have to stream their buffer contents 215*8975f5c5SAndroid Build Coastguard Worker gl::AttributesMask mStreamingVertexAttribsMask; 216*8975f5c5SAndroid Build Coastguard Worker 217*8975f5c5SAndroid Build Coastguard Worker // The attrib/binding dirty bits that requires graphics pipeline update 218*8975f5c5SAndroid Build Coastguard Worker gl::VertexArray::DirtyBindingBits mBindingDirtyBitsRequiresPipelineUpdate; 219*8975f5c5SAndroid Build Coastguard Worker gl::VertexArray::DirtyAttribBits mAttribDirtyBitsRequiresPipelineUpdate; 220*8975f5c5SAndroid Build Coastguard Worker }; 221*8975f5c5SAndroid Build Coastguard Worker } // namespace rx 222*8975f5c5SAndroid Build Coastguard Worker 223*8975f5c5SAndroid Build Coastguard Worker #endif // LIBANGLE_RENDERER_VULKAN_VERTEXARRAYVK_H_ 224