• 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 // TransformFeedbackVk.h:
7 //    Defines the class interface for TransformFeedbackVk, implementing TransformFeedbackImpl.
8 //
9 
10 #ifndef LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
11 #define LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
12 
13 #include "libANGLE/renderer/TransformFeedbackImpl.h"
14 
15 #include "libANGLE/renderer/glslang_wrapper_utils.h"
16 #include "libANGLE/renderer/vulkan/vk_helpers.h"
17 
18 namespace gl
19 {
20 class ProgramState;
21 }  // namespace gl
22 
23 namespace rx
24 {
25 class UpdateDescriptorSetsBuilder;
26 
27 namespace vk
28 {
29 class DescriptorSetLayoutDesc;
30 }  // namespace vk
31 
32 class TransformFeedbackVk : public TransformFeedbackImpl, public angle::ObserverInterface
33 {
34   public:
35     TransformFeedbackVk(const gl::TransformFeedbackState &state);
36     ~TransformFeedbackVk() override;
37     void onDestroy(const gl::Context *context) override;
38 
39     angle::Result begin(const gl::Context *context, gl::PrimitiveMode primitiveMode) override;
40     angle::Result end(const gl::Context *context) override;
41     angle::Result pause(const gl::Context *context) override;
42     angle::Result resume(const gl::Context *context) override;
43 
44     angle::Result bindIndexedBuffer(const gl::Context *context,
45                                     size_t index,
46                                     const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
47 
48     void updateDescriptorSetLayout(ContextVk *contextVk,
49                                    const ShaderInterfaceVariableInfoMap &variableInfoMap,
50                                    size_t xfbBufferCount,
51                                    vk::DescriptorSetLayoutDesc *descSetLayoutOut) const;
52     void initDescriptorSet(vk::Context *context,
53                            UpdateDescriptorSetsBuilder *updateBuilder,
54                            vk::BufferHelper *emptyBuffer,
55                            const ShaderInterfaceVariableInfoMap &variableInfoMap,
56                            size_t xfbBufferCount,
57                            VkDescriptorSet descSet) const;
58     void updateDescriptorSet(vk::Context *context,
59                              UpdateDescriptorSetsBuilder *updateBuilder,
60                              const gl::ProgramExecutable &executable,
61                              const ShaderInterfaceVariableInfoMap &variableInfoMap,
62                              VkDescriptorSet descSet) const;
63     void getBufferOffsets(ContextVk *contextVk,
64                           GLint drawCallFirstVertex,
65                           int32_t *offsetsOut,
66                           size_t offsetsSize) const;
67 
getAndResetBufferRebindState()68     bool getAndResetBufferRebindState()
69     {
70         bool retVal                    = mRebindTransformFeedbackBuffer;
71         mRebindTransformFeedbackBuffer = false;
72         return retVal;
73     }
74 
getBufferHelpers()75     const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &getBufferHelpers() const
76     {
77         return mBufferHelpers;
78     }
79 
getBufferHandles()80     const gl::TransformFeedbackBuffersArray<VkBuffer> &getBufferHandles() const
81     {
82         return mBufferHandles;
83     }
84 
getBufferOffsets()85     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferOffsets() const
86     {
87         return mBufferOffsets;
88     }
89 
getBufferSizes()90     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferSizes() const
91     {
92         return mBufferSizes;
93     }
94 
getCounterBufferHelpers()95     gl::TransformFeedbackBuffersArray<vk::BufferHelper> &getCounterBufferHelpers()
96     {
97         return mCounterBufferHelpers;
98     }
99 
getCounterBufferHandles()100     const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const
101     {
102         return mCounterBufferHandles;
103     }
104 
getTransformFeedbackDesc()105     vk::DescriptorSetDesc &getTransformFeedbackDesc() { return mXFBBuffersDesc; }
106 
getCounterBufferOffsets()107     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getCounterBufferOffsets() const
108     {
109         return mCounterBufferOffsets;
110     }
111 
112     void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
113 
114   private:
115     void writeDescriptorSet(vk::Context *context,
116                             UpdateDescriptorSetsBuilder *updateBuilder,
117                             const ShaderInterfaceVariableInfoMap &variableInfoMap,
118                             size_t xfbBufferCount,
119                             VkDescriptorBufferInfo *bufferInfo,
120                             VkDescriptorSet descSet) const;
121 
122     void initializeXFBBuffersDesc(ContextVk *contextVk, size_t xfbBufferCount);
123 
124     void releaseCounterBuffers(RendererVk *renderer);
125 
126     // This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback
127     // is called and unset in dirty bit handler for transform feedback state change. If this
128     // value is true, vertex shader will record transform feedback varyings from the beginning
129     // of the buffer.
130     bool mRebindTransformFeedbackBuffer;
131 
132     gl::TransformFeedbackBuffersArray<vk::BufferHelper *> mBufferHelpers;
133     gl::TransformFeedbackBuffersArray<VkBuffer> mBufferHandles;
134     gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferOffsets;
135     gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferSizes;
136 
137     // Counter buffer used for pause and resume.
138     gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBufferHelpers;
139     gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles;
140     gl::TransformFeedbackBuffersArray<VkDeviceSize> mCounterBufferOffsets;
141 
142     // Keys to look up in the descriptor set cache
143     vk::DescriptorSetDesc mXFBBuffersDesc;
144 
145     // Buffer binding points
146     std::vector<angle::ObserverBinding> mBufferObserverBindings;
147 };
148 
149 }  // namespace rx
150 
151 #endif  // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
152