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 class VertexArrayVk : public VertexArrayImpl 23 { 24 public: 25 VertexArrayVk(ContextVk *contextVk, const gl::VertexArrayState &state); 26 ~VertexArrayVk() override; 27 28 void destroy(const gl::Context *context) override; 29 30 angle::Result syncState(const gl::Context *context, 31 const gl::VertexArray::DirtyBits &dirtyBits, 32 gl::VertexArray::DirtyAttribBitsArray *attribBits, 33 gl::VertexArray::DirtyBindingBitsArray *bindingBits) override; 34 35 void updateDefaultAttrib(ContextVk *contextVk, 36 size_t attribIndex, 37 VkBuffer bufferHandle, 38 uint32_t offset); 39 40 angle::Result updateClientAttribs(const gl::Context *context, 41 GLint firstVertex, 42 GLsizei vertexOrIndexCount, 43 GLsizei instanceCount, 44 gl::DrawElementsType indexTypeOrInvalid, 45 const void *indices); 46 47 angle::Result handleLineLoop(ContextVk *contextVk, 48 GLint firstVertex, 49 GLsizei vertexOrIndexCount, 50 gl::DrawElementsType indexTypeOrInvalid, 51 const void *indices, 52 uint32_t *indexCountOut); 53 getCurrentArrayBufferHandles()54 const gl::AttribArray<VkBuffer> &getCurrentArrayBufferHandles() const 55 { 56 return mCurrentArrayBufferHandles; 57 } 58 getCurrentArrayBufferOffsets()59 const gl::AttribArray<VkDeviceSize> &getCurrentArrayBufferOffsets() const 60 { 61 return mCurrentArrayBufferOffsets; 62 } 63 getCurrentArrayBuffers()64 const gl::AttribArray<vk::BufferHelper *> &getCurrentArrayBuffers() const 65 { 66 return mCurrentArrayBuffers; 67 } 68 getCurrentElementArrayBufferOffset()69 VkDeviceSize getCurrentElementArrayBufferOffset() const 70 { 71 return mCurrentElementArrayBufferOffset; 72 } 73 updateCurrentElementArrayBufferOffset(const GLvoid * offset)74 void updateCurrentElementArrayBufferOffset(const GLvoid *offset) 75 { 76 mCurrentElementArrayBufferOffset = reinterpret_cast<VkDeviceSize>(offset); 77 } 78 getCurrentElementArrayBuffer()79 vk::BufferHelper *getCurrentElementArrayBuffer() const { return mCurrentElementArrayBuffer; } 80 81 angle::Result convertIndexBufferGPU(ContextVk *contextVk, 82 BufferVk *bufferVk, 83 const void *indices); 84 85 angle::Result convertIndexBufferCPU(ContextVk *contextVk, 86 gl::DrawElementsType indexType, 87 size_t indexCount, 88 const void *sourcePointer); 89 90 private: 91 void setDefaultPackedInput(ContextVk *contextVk, size_t attribIndex); 92 93 angle::Result convertVertexBufferGPU(ContextVk *contextVk, 94 BufferVk *srcBuffer, 95 const gl::VertexBinding &binding, 96 size_t attribIndex, 97 const vk::Format &vertexFormat, 98 ConversionBuffer *conversion, 99 GLuint relativeOffset); 100 angle::Result convertVertexBufferCPU(ContextVk *contextVk, 101 BufferVk *srcBuffer, 102 const gl::VertexBinding &binding, 103 size_t attribIndex, 104 const vk::Format &vertexFormat, 105 ConversionBuffer *conversion, 106 GLuint relativeOffset); 107 108 angle::Result syncDirtyAttrib(ContextVk *contextVk, 109 const gl::VertexAttribute &attrib, 110 const gl::VertexBinding &binding, 111 size_t attribIndex); 112 113 void syncDirtyBuffer(ContextVk *contextVk, 114 const gl::VertexBinding &binding, 115 size_t bindingIndex); 116 117 gl::AttribArray<VkBuffer> mCurrentArrayBufferHandles; 118 gl::AttribArray<VkDeviceSize> mCurrentArrayBufferOffsets; 119 gl::AttribArray<vk::BufferHelper *> mCurrentArrayBuffers; 120 VkDeviceSize mCurrentElementArrayBufferOffset; 121 vk::BufferHelper *mCurrentElementArrayBuffer; 122 123 vk::DynamicBuffer mDynamicVertexData; 124 vk::DynamicBuffer mDynamicIndexData; 125 vk::DynamicBuffer mTranslatedByteIndexData; 126 127 vk::LineLoopHelper mLineLoopHelper; 128 Optional<GLint> mLineLoopBufferFirstIndex; 129 Optional<size_t> mLineLoopBufferLastIndex; 130 bool mDirtyLineLoopTranslation; 131 132 // Vulkan does not allow binding a null vertex buffer. We use a dummy as a placeholder. 133 vk::BufferHelper mTheNullBuffer; 134 }; 135 } // namespace rx 136 137 #endif // LIBANGLE_RENDERER_VULKAN_VERTEXARRAYVK_H_ 138