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