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/vulkan/vk_helpers.h" 16 17 namespace gl 18 { 19 class ProgramState; 20 } // namespace gl 21 22 namespace rx 23 { 24 class UpdateDescriptorSetsBuilder; 25 class ShaderInterfaceVariableInfoMap; 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 getBufferOffsets(ContextVk *contextVk, 49 GLint drawCallFirstVertex, 50 int32_t *offsetsOut, 51 size_t offsetsSize) const; 52 getAndResetBufferRebindState()53 bool getAndResetBufferRebindState() 54 { 55 bool retVal = mRebindTransformFeedbackBuffer; 56 mRebindTransformFeedbackBuffer = false; 57 return retVal; 58 } 59 getBufferHelpers()60 const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &getBufferHelpers() const 61 { 62 return mBufferHelpers; 63 } 64 getBufferHandles()65 const gl::TransformFeedbackBuffersArray<VkBuffer> &getBufferHandles() const 66 { 67 return mBufferHandles; 68 } 69 getBufferOffsets()70 const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferOffsets() const 71 { 72 return mBufferOffsets; 73 } 74 getBufferSizes()75 const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferSizes() const 76 { 77 return mBufferSizes; 78 } 79 getCounterBufferHelpers()80 gl::TransformFeedbackBuffersArray<vk::BufferHelper> &getCounterBufferHelpers() 81 { 82 return mCounterBufferHelpers; 83 } 84 getCounterBufferHandles()85 const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const 86 { 87 return mCounterBufferHandles; 88 } 89 90 void updateTransformFeedbackDescriptorDesc( 91 const vk::Context *context, 92 const gl::ProgramExecutable &executable, 93 const ShaderInterfaceVariableInfoMap &variableInfoMap, 94 const vk::WriteDescriptorDescs &writeDescriptorDescs, 95 const vk::BufferHelper &emptyBuffer, 96 bool activeUnpaused, 97 vk::DescriptorSetDescBuilder *builder) const; 98 getCounterBufferOffsets()99 const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getCounterBufferOffsets() const 100 { 101 return mCounterBufferOffsets; 102 } 103 104 void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override; 105 106 void onNewDescriptorSet(const gl::ProgramExecutable &executable, 107 const vk::SharedDescriptorSetCacheKey &sharedCacheKey); 108 109 private: 110 void initializeXFBVariables(ContextVk *contextVk, uint32_t xfbBufferCount); 111 112 void releaseCounterBuffers(vk::Renderer *renderer); 113 114 // This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback 115 // is called and unset in dirty bit handler for transform feedback state change. If this 116 // value is true, vertex shader will record transform feedback varyings from the beginning 117 // of the buffer. 118 bool mRebindTransformFeedbackBuffer; 119 120 gl::TransformFeedbackBuffersArray<vk::BufferHelper *> mBufferHelpers; 121 gl::TransformFeedbackBuffersArray<VkBuffer> mBufferHandles; 122 gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferOffsets; 123 gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferSizes; 124 125 // Counter buffer used for pause and resume. 126 gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBufferHelpers; 127 gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles; 128 gl::TransformFeedbackBuffersArray<VkDeviceSize> mCounterBufferOffsets; 129 130 // Buffer binding points 131 std::vector<angle::ObserverBinding> mBufferObserverBindings; 132 }; 133 134 } // namespace rx 135 136 #endif // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_ 137