xref: /aosp_15_r20/external/angle/src/libANGLE/renderer/vulkan/TransformFeedbackVk.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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/vulkan/vk_helpers.h"
16 
17 namespace gl
18 {
19 class ProgramState;
20 }  // namespace gl
21 
22 namespace rx
23 {
24 class UpdateDescriptorSetsBuilder;
25 class ShaderInterfaceVariableInfoMap;
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 getBufferOffsets(ContextVk *contextVk,
49                           GLint drawCallFirstVertex,
50                           int32_t *offsetsOut,
51                           size_t offsetsSize) const;
52 
getAndResetBufferRebindState()53     bool getAndResetBufferRebindState()
54     {
55         bool retVal                    = mRebindTransformFeedbackBuffer;
56         mRebindTransformFeedbackBuffer = false;
57         return retVal;
58     }
59 
getBufferHelpers()60     const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &getBufferHelpers() const
61     {
62         return mBufferHelpers;
63     }
64 
getBufferHandles()65     const gl::TransformFeedbackBuffersArray<VkBuffer> &getBufferHandles() const
66     {
67         return mBufferHandles;
68     }
69 
getBufferOffsets()70     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferOffsets() const
71     {
72         return mBufferOffsets;
73     }
74 
getBufferSizes()75     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferSizes() const
76     {
77         return mBufferSizes;
78     }
79 
getCounterBufferHelpers()80     gl::TransformFeedbackBuffersArray<vk::BufferHelper> &getCounterBufferHelpers()
81     {
82         return mCounterBufferHelpers;
83     }
84 
getCounterBufferHandles()85     const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const
86     {
87         return mCounterBufferHandles;
88     }
89 
90     void updateTransformFeedbackDescriptorDesc(
91         const vk::Context *context,
92         const gl::ProgramExecutable &executable,
93         const ShaderInterfaceVariableInfoMap &variableInfoMap,
94         const vk::WriteDescriptorDescs &writeDescriptorDescs,
95         const vk::BufferHelper &emptyBuffer,
96         bool activeUnpaused,
97         vk::DescriptorSetDescBuilder *builder) const;
98 
getCounterBufferOffsets()99     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getCounterBufferOffsets() const
100     {
101         return mCounterBufferOffsets;
102     }
103 
104     void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
105 
106     void onNewDescriptorSet(const gl::ProgramExecutable &executable,
107                             const vk::SharedDescriptorSetCacheKey &sharedCacheKey);
108 
109   private:
110     void initializeXFBVariables(ContextVk *contextVk, uint32_t xfbBufferCount);
111 
112     void releaseCounterBuffers(vk::Renderer *renderer);
113 
114     // This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback
115     // is called and unset in dirty bit handler for transform feedback state change. If this
116     // value is true, vertex shader will record transform feedback varyings from the beginning
117     // of the buffer.
118     bool mRebindTransformFeedbackBuffer;
119 
120     gl::TransformFeedbackBuffersArray<vk::BufferHelper *> mBufferHelpers;
121     gl::TransformFeedbackBuffersArray<VkBuffer> mBufferHandles;
122     gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferOffsets;
123     gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferSizes;
124 
125     // Counter buffer used for pause and resume.
126     gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBufferHelpers;
127     gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles;
128     gl::TransformFeedbackBuffersArray<VkDeviceSize> mCounterBufferOffsets;
129 
130     // Buffer binding points
131     std::vector<angle::ObserverBinding> mBufferObserverBindings;
132 };
133 
134 }  // namespace rx
135 
136 #endif  // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
137