1 // 2 // Copyright 2016 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 // VertexArrayVk.h: 7 // Defines the class interface for VertexArrayVk, implementing VertexArrayImpl. 8 // 9 10 #ifndef LIBANGLE_RENDERER_VULKAN_VERTEXARRAYVK_H_ 11 #define LIBANGLE_RENDERER_VULKAN_VERTEXARRAYVK_H_ 12 13 #include "libANGLE/renderer/VertexArrayImpl.h" 14 #include "libANGLE/renderer/vulkan/vk_cache_utils.h" 15 #include "libANGLE/renderer/vulkan/vk_helpers.h" 16 17 namespace rx 18 { 19 class BufferVk; 20 struct ConversionBuffer; 21 22 enum class BufferBindingDirty 23 { 24 No, 25 Yes, 26 }; 27 28 class VertexArrayVk : public VertexArrayImpl 29 { 30 public: 31 VertexArrayVk(ContextVk *contextVk, const gl::VertexArrayState &state); 32 ~VertexArrayVk() override; 33 34 void destroy(const gl::Context *context) override; 35 36 angle::Result syncState(const gl::Context *context, 37 const gl::VertexArray::DirtyBits &dirtyBits, 38 gl::VertexArray::DirtyAttribBitsArray *attribBits, 39 gl::VertexArray::DirtyBindingBitsArray *bindingBits) override; 40 41 angle::Result updateActiveAttribInfo(ContextVk *contextVk); 42 43 angle::Result updateDefaultAttrib(ContextVk *contextVk, size_t attribIndex); 44 45 angle::Result updateStreamedAttribs(const gl::Context *context, 46 GLint firstVertex, 47 GLsizei vertexOrIndexCount, 48 GLsizei instanceCount, 49 gl::DrawElementsType indexTypeOrInvalid, 50 const void *indices); 51 52 angle::Result handleLineLoop(ContextVk *contextVk, 53 GLint firstVertex, 54 GLsizei vertexOrIndexCount, 55 gl::DrawElementsType indexTypeOrInvalid, 56 const void *indices, 57 uint32_t *indexCountOut); 58 59 angle::Result handleLineLoopIndexIndirect(ContextVk *contextVk, 60 gl::DrawElementsType glIndexType, 61 vk::BufferHelper *srcIndirectBuf, 62 VkDeviceSize indirectBufferOffset, 63 vk::BufferHelper **indirectBufferOut); 64 65 angle::Result handleLineLoopIndirectDraw(const gl::Context *context, 66 vk::BufferHelper *indirectBufferVk, 67 VkDeviceSize indirectBufferOffset, 68 vk::BufferHelper **indirectBufferOut); 69 getCurrentArrayBufferHandles()70 const gl::AttribArray<VkBuffer> &getCurrentArrayBufferHandles() const 71 { 72 return mCurrentArrayBufferHandles; 73 } 74 getCurrentArrayBufferOffsets()75 const gl::AttribArray<VkDeviceSize> &getCurrentArrayBufferOffsets() const 76 { 77 return mCurrentArrayBufferOffsets; 78 } 79 getCurrentArrayBuffers()80 const gl::AttribArray<vk::BufferHelper *> &getCurrentArrayBuffers() const 81 { 82 return mCurrentArrayBuffers; 83 } 84 85 // Update mCurrentElementArrayBuffer based on the vertex array state 86 void updateCurrentElementArrayBuffer(); 87 getCurrentElementArrayBuffer()88 vk::BufferHelper *getCurrentElementArrayBuffer() const { return mCurrentElementArrayBuffer; } 89 90 angle::Result convertIndexBufferGPU(ContextVk *contextVk, 91 BufferVk *bufferVk, 92 const void *indices); 93 94 angle::Result convertIndexBufferIndirectGPU(ContextVk *contextVk, 95 vk::BufferHelper *srcIndirectBuf, 96 VkDeviceSize srcIndirectBufOffset, 97 vk::BufferHelper **indirectBufferVkOut); 98 99 angle::Result convertIndexBufferCPU(ContextVk *contextVk, 100 gl::DrawElementsType indexType, 101 size_t indexCount, 102 const void *sourcePointer, 103 BufferBindingDirty *bufferBindingDirty); 104 getStreamingVertexAttribsMask()105 const gl::AttributesMask &getStreamingVertexAttribsMask() const 106 { 107 return mStreamingVertexAttribsMask; 108 } 109 110 private: 111 angle::Result setDefaultPackedInput(ContextVk *contextVk, size_t attribIndex); 112 113 angle::Result convertVertexBufferGPU(ContextVk *contextVk, 114 BufferVk *srcBuffer, 115 const gl::VertexBinding &binding, 116 size_t attribIndex, 117 const vk::Format &vertexFormat, 118 ConversionBuffer *conversion, 119 GLuint relativeOffset, 120 bool compressed); 121 angle::Result convertVertexBufferCPU(ContextVk *contextVk, 122 BufferVk *srcBuffer, 123 const gl::VertexBinding &binding, 124 size_t attribIndex, 125 const vk::Format &vertexFormat, 126 ConversionBuffer *conversion, 127 GLuint relativeOffset, 128 bool compress); 129 130 angle::Result syncDirtyAttrib(ContextVk *contextVk, 131 const gl::VertexAttribute &attrib, 132 const gl::VertexBinding &binding, 133 size_t attribIndex, 134 bool bufferOnly); 135 136 gl::AttribArray<VkBuffer> mCurrentArrayBufferHandles; 137 gl::AttribArray<VkDeviceSize> mCurrentArrayBufferOffsets; 138 // The offset into the buffer to the first attrib 139 gl::AttribArray<GLuint> mCurrentArrayBufferRelativeOffsets; 140 gl::AttribArray<vk::BufferHelper *> mCurrentArrayBuffers; 141 // Cache strides of attributes for a fast pipeline cache update when VAOs are changed 142 gl::AttribArray<GLuint> mCurrentArrayBufferStrides; 143 gl::AttributesMask mCurrentArrayBufferCompressed; 144 vk::BufferHelper *mCurrentElementArrayBuffer; 145 146 // Cached element array buffers for improving performance. 147 vk::BufferHelperPointerVector mCachedStreamIndexBuffers; 148 149 vk::BufferHelper mStreamedIndexData; 150 vk::BufferHelper mTranslatedByteIndexData; 151 vk::BufferHelper mTranslatedByteIndirectData; 152 153 vk::LineLoopHelper mLineLoopHelper; 154 Optional<GLint> mLineLoopBufferFirstIndex; 155 Optional<size_t> mLineLoopBufferLastIndex; 156 bool mDirtyLineLoopTranslation; 157 158 // Track client and/or emulated attribs that we have to stream their buffer contents 159 gl::AttributesMask mStreamingVertexAttribsMask; 160 }; 161 } // namespace rx 162 163 #endif // LIBANGLE_RENDERER_VULKAN_VERTEXARRAYVK_H_ 164