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