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 class UpdateDescriptorSetsBuilder; 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 updateDescriptorSetLayout(ContextVk *contextVk, 49 const ShaderInterfaceVariableInfoMap &variableInfoMap, 50 size_t xfbBufferCount, 51 vk::DescriptorSetLayoutDesc *descSetLayoutOut) const; 52 void initDescriptorSet(vk::Context *context, 53 UpdateDescriptorSetsBuilder *updateBuilder, 54 vk::BufferHelper *emptyBuffer, 55 const ShaderInterfaceVariableInfoMap &variableInfoMap, 56 size_t xfbBufferCount, 57 VkDescriptorSet descSet) const; 58 void updateDescriptorSet(vk::Context *context, 59 UpdateDescriptorSetsBuilder *updateBuilder, 60 const gl::ProgramExecutable &executable, 61 const ShaderInterfaceVariableInfoMap &variableInfoMap, 62 VkDescriptorSet descSet) const; 63 void getBufferOffsets(ContextVk *contextVk, 64 GLint drawCallFirstVertex, 65 int32_t *offsetsOut, 66 size_t offsetsSize) const; 67 getAndResetBufferRebindState()68 bool getAndResetBufferRebindState() 69 { 70 bool retVal = mRebindTransformFeedbackBuffer; 71 mRebindTransformFeedbackBuffer = false; 72 return retVal; 73 } 74 getBufferHelpers()75 const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &getBufferHelpers() const 76 { 77 return mBufferHelpers; 78 } 79 getBufferHandles()80 const gl::TransformFeedbackBuffersArray<VkBuffer> &getBufferHandles() const 81 { 82 return mBufferHandles; 83 } 84 getBufferOffsets()85 const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferOffsets() const 86 { 87 return mBufferOffsets; 88 } 89 getBufferSizes()90 const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferSizes() const 91 { 92 return mBufferSizes; 93 } 94 getCounterBufferHelpers()95 gl::TransformFeedbackBuffersArray<vk::BufferHelper> &getCounterBufferHelpers() 96 { 97 return mCounterBufferHelpers; 98 } 99 getCounterBufferHandles()100 const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const 101 { 102 return mCounterBufferHandles; 103 } 104 getTransformFeedbackDesc()105 vk::DescriptorSetDesc &getTransformFeedbackDesc() { return mXFBBuffersDesc; } 106 getCounterBufferOffsets()107 const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getCounterBufferOffsets() const 108 { 109 return mCounterBufferOffsets; 110 } 111 112 void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; 113 114 private: 115 void writeDescriptorSet(vk::Context *context, 116 UpdateDescriptorSetsBuilder *updateBuilder, 117 const ShaderInterfaceVariableInfoMap &variableInfoMap, 118 size_t xfbBufferCount, 119 VkDescriptorBufferInfo *bufferInfo, 120 VkDescriptorSet descSet) const; 121 122 void initializeXFBBuffersDesc(ContextVk *contextVk, size_t xfbBufferCount); 123 124 void releaseCounterBuffers(RendererVk *renderer); 125 126 // This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback 127 // is called and unset in dirty bit handler for transform feedback state change. If this 128 // value is true, vertex shader will record transform feedback varyings from the beginning 129 // of the buffer. 130 bool mRebindTransformFeedbackBuffer; 131 132 gl::TransformFeedbackBuffersArray<vk::BufferHelper *> mBufferHelpers; 133 gl::TransformFeedbackBuffersArray<VkBuffer> mBufferHandles; 134 gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferOffsets; 135 gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferSizes; 136 137 // Counter buffer used for pause and resume. 138 gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBufferHelpers; 139 gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles; 140 gl::TransformFeedbackBuffersArray<VkDeviceSize> mCounterBufferOffsets; 141 142 // Keys to look up in the descriptor set cache 143 vk::DescriptorSetDesc mXFBBuffersDesc; 144 145 // Buffer binding points 146 std::vector<angle::ObserverBinding> mBufferObserverBindings; 147 }; 148 149 } // namespace rx 150 151 #endif // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_ 152