• 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 namespace vk
26 {
27 class DescriptorSetLayoutDesc;
28 }
29 
30 class TransformFeedbackVk : public TransformFeedbackImpl
31 {
32   public:
33     TransformFeedbackVk(const gl::TransformFeedbackState &state);
34     ~TransformFeedbackVk() override;
35     void onDestroy(const gl::Context *context) override;
36 
37     angle::Result begin(const gl::Context *context, gl::PrimitiveMode primitiveMode) override;
38     angle::Result end(const gl::Context *context) override;
39     angle::Result pause(const gl::Context *context) override;
40     angle::Result resume(const gl::Context *context) override;
41 
42     angle::Result bindIndexedBuffer(const gl::Context *context,
43                                     size_t index,
44                                     const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
45 
46     void updateDescriptorSetLayout(ContextVk *contextVk,
47                                    ShaderInterfaceVariableInfoMap &vsVariableInfoMap,
48                                    size_t xfbBufferCount,
49                                    vk::DescriptorSetLayoutDesc *descSetLayoutOut) const;
50     void initDescriptorSet(ContextVk *contextVk,
51                            size_t xfbBufferCount,
52                            vk::BufferHelper *emptyBuffer,
53                            VkDescriptorSet descSet) const;
54     void updateDescriptorSet(ContextVk *contextVk,
55                              const gl::ProgramState &programState,
56                              VkDescriptorSet descSet) const;
57     void getBufferOffsets(ContextVk *contextVk,
58                           GLint drawCallFirstVertex,
59                           int32_t *offsetsOut,
60                           size_t offsetsSize) const;
61 
getAndResetBufferRebindState()62     bool getAndResetBufferRebindState()
63     {
64         bool retVal                    = mRebindTransformFeedbackBuffer;
65         mRebindTransformFeedbackBuffer = false;
66         return retVal;
67     }
68 
getBufferHelpers()69     const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &getBufferHelpers() const
70     {
71         return mBufferHelpers;
72     }
73 
getBufferHandles()74     const gl::TransformFeedbackBuffersArray<VkBuffer> &getBufferHandles() const
75     {
76         return mBufferHandles;
77     }
78 
getBufferOffsets()79     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferOffsets() const
80     {
81         return mBufferOffsets;
82     }
83 
getBufferSizes()84     const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferSizes() const
85     {
86         return mBufferSizes;
87     }
88 
getCounterBufferHandles()89     const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const
90     {
91         return mCounterBufferHandles;
92     }
93 
94   private:
95     angle::Result onTransformFeedbackStateChanged(ContextVk *contextVk);
96     void writeDescriptorSet(ContextVk *contextVk,
97                             size_t xfbBufferCount,
98                             VkDescriptorBufferInfo *pBufferInfo,
99                             VkDescriptorSet descSet) const;
100 
101     // This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback
102     // is called and unset in dirty bit handler for transform feedback state change. If this
103     // value is true, vertex shader will record transform feedback varyings from the beginning
104     // of the buffer.
105     bool mRebindTransformFeedbackBuffer;
106 
107     gl::TransformFeedbackBuffersArray<vk::BufferHelper *> mBufferHelpers;
108     gl::TransformFeedbackBuffersArray<VkBuffer> mBufferHandles;
109     gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferOffsets;
110     gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferSizes;
111 
112     // Aligned offset for emulation. Could be smaller than offset.
113     gl::TransformFeedbackBuffersArray<VkDeviceSize> mAlignedBufferOffsets;
114 
115     // Counter buffer used for pause and resume.
116     gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBufferHelpers;
117     gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles;
118 };
119 
120 }  // namespace rx
121 
122 #endif  // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
123