• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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