• 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 // Cached buffer properties for faster descriptor set update and offset calculation.
31 struct TransformFeedbackBufferRange
32 {
33     // Offset as provided by OffsetBindingPointer.
34     gl::TransformFeedbackBuffersArray<VkDeviceSize> offsets;
35     // Size as provided by OffsetBindingPointer.
36     gl::TransformFeedbackBuffersArray<VkDeviceSize> sizes;
37     // Aligned offset usable for VkDescriptorBufferInfo.  This value could be smaller than
38     // offset.
39     gl::TransformFeedbackBuffersArray<VkDeviceSize> alignedOffsets;
40 };
41 
42 class TransformFeedbackVk : public TransformFeedbackImpl
43 {
44   public:
45     TransformFeedbackVk(const gl::TransformFeedbackState &state);
46     ~TransformFeedbackVk() override;
47     void onDestroy(const gl::Context *context) override;
48 
49     angle::Result begin(const gl::Context *context, gl::PrimitiveMode primitiveMode) override;
50     angle::Result end(const gl::Context *context) override;
51     angle::Result pause(const gl::Context *context) override;
52     angle::Result resume(const gl::Context *context) override;
53 
54     angle::Result bindIndexedBuffer(const gl::Context *context,
55                                     size_t index,
56                                     const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
57 
58     void updateDescriptorSetLayout(ContextVk *contextVk,
59                                    ShaderInterfaceVariableInfoMap &vsVariableInfoMap,
60                                    size_t xfbBufferCount,
61                                    vk::DescriptorSetLayoutDesc *descSetLayoutOut) const;
62     void initDescriptorSet(ContextVk *contextVk,
63                            size_t xfbBufferCount,
64                            vk::BufferHelper *emptyBuffer,
65                            VkDescriptorSet descSet) const;
66     void updateDescriptorSet(ContextVk *contextVk,
67                              const gl::ProgramState &programState,
68                              VkDescriptorSet descSet) const;
69     void getBufferOffsets(ContextVk *contextVk,
70                           GLint drawCallFirstVertex,
71                           int32_t *offsetsOut,
72                           size_t offsetsSize) const;
73 
unsetTransformFeedbackBufferRebindState()74     void unsetTransformFeedbackBufferRebindState() { mRebindTransformFeedbackBuffer = false; }
75 
getTransformFeedbackBufferRebindState()76     bool getTransformFeedbackBufferRebindState() const { return mRebindTransformFeedbackBuffer; }
77 
getTransformFeedbackBufferRange()78     const TransformFeedbackBufferRange &getTransformFeedbackBufferRange() const
79     {
80         return mTransformFeedbackBufferRange;
81     }
82 
getCounterBufferHandles()83     const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const
84     {
85         return mCounterBufferHandles;
86     }
87 
88   private:
89     angle::Result onTransformFeedbackStateChanged(ContextVk *contextVk);
90     void writeDescriptorSet(ContextVk *contextVk,
91                             size_t xfbBufferCount,
92                             VkDescriptorBufferInfo *pBufferInfo,
93                             VkDescriptorSet descSet) const;
94 
95     // This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback
96     // is called and unset in dirty bit handler for transform feedback state change. If this
97     // value is true, vertex shader will record transform feedback varyings from the beginning
98     // of the buffer.
99     bool mRebindTransformFeedbackBuffer;
100     TransformFeedbackBufferRange mTransformFeedbackBufferRange;
101     // Counter buffer used for pause and resume.
102     gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBuffer;
103     gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles;
104 };
105 
106 }  // namespace rx
107 
108 #endif  // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
109