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