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