• 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 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