Hash :
e8ee847d
Author :
Date :
2022-02-23T12:25:39
Vulkan: Add UpdateDescriptorSetsBuilder. This helper class encapsulates the vkUpdateDescriptorSets caching. As part of the refactor, we switch passing a ContextVk to passing a vk::Context with some mutable variables. This helps encapsulate ContextVk. Since we use the perf counters in many places, this CL moves the perf counters to vk::Context, so we can access them everywhere. Refactoring change only. Bug: angleproject:6776 Change-Id: Id529962b2f425bece6f9b3bd0cd1698c692e58cb Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/3484980 Reviewed-by: Charlie Lao <cclao@google.com> Reviewed-by: Yuxin Hu <yuxinhu@google.com> Commit-Queue: Jamie Madill <jmadill@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
//
// Copyright 2016 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// TransformFeedbackVk.h:
// Defines the class interface for TransformFeedbackVk, implementing TransformFeedbackImpl.
//
#ifndef LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
#define LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_
#include "libANGLE/renderer/TransformFeedbackImpl.h"
#include "libANGLE/renderer/glslang_wrapper_utils.h"
#include "libANGLE/renderer/vulkan/vk_helpers.h"
namespace gl
{
class ProgramState;
} // namespace gl
namespace rx
{
class UpdateDescriptorSetsBuilder;
namespace vk
{
class DescriptorSetLayoutDesc;
} // namespace vk
class TransformFeedbackVk : public TransformFeedbackImpl, public angle::ObserverInterface
{
public:
TransformFeedbackVk(const gl::TransformFeedbackState &state);
~TransformFeedbackVk() override;
void onDestroy(const gl::Context *context) override;
angle::Result begin(const gl::Context *context, gl::PrimitiveMode primitiveMode) override;
angle::Result end(const gl::Context *context) override;
angle::Result pause(const gl::Context *context) override;
angle::Result resume(const gl::Context *context) override;
angle::Result bindIndexedBuffer(const gl::Context *context,
size_t index,
const gl::OffsetBindingPointer<gl::Buffer> &binding) override;
void updateDescriptorSetLayout(ContextVk *contextVk,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
size_t xfbBufferCount,
vk::DescriptorSetLayoutDesc *descSetLayoutOut) const;
void initDescriptorSet(vk::Context *context,
UpdateDescriptorSetsBuilder *updateBuilder,
vk::BufferHelper *emptyBuffer,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
size_t xfbBufferCount,
VkDescriptorSet descSet) const;
void updateDescriptorSet(vk::Context *context,
UpdateDescriptorSetsBuilder *updateBuilder,
const gl::ProgramExecutable &executable,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
VkDescriptorSet descSet) const;
void getBufferOffsets(ContextVk *contextVk,
GLint drawCallFirstVertex,
int32_t *offsetsOut,
size_t offsetsSize) const;
bool getAndResetBufferRebindState()
{
bool retVal = mRebindTransformFeedbackBuffer;
mRebindTransformFeedbackBuffer = false;
return retVal;
}
const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &getBufferHelpers() const
{
return mBufferHelpers;
}
const gl::TransformFeedbackBuffersArray<VkBuffer> &getBufferHandles() const
{
return mBufferHandles;
}
const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferOffsets() const
{
return mBufferOffsets;
}
const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferSizes() const
{
return mBufferSizes;
}
gl::TransformFeedbackBuffersArray<vk::BufferHelper> &getCounterBufferHelpers()
{
return mCounterBufferHelpers;
}
const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const
{
return mCounterBufferHandles;
}
vk::DescriptorSetDesc &getTransformFeedbackDesc() { return mXFBBuffersDesc; }
const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getCounterBufferOffsets() const
{
return mCounterBufferOffsets;
}
void onSubjectStateChange(angle::SubjectIndex index, angle::SubjectMessage message) override;
private:
void writeDescriptorSet(vk::Context *context,
UpdateDescriptorSetsBuilder *updateBuilder,
const ShaderInterfaceVariableInfoMap &variableInfoMap,
size_t xfbBufferCount,
VkDescriptorBufferInfo *bufferInfo,
VkDescriptorSet descSet) const;
void initializeXFBBuffersDesc(ContextVk *contextVk, size_t xfbBufferCount);
void releaseCounterBuffers(RendererVk *renderer);
// This member variable is set when glBindTransformFeedbackBuffers/glBeginTransformFeedback
// is called and unset in dirty bit handler for transform feedback state change. If this
// value is true, vertex shader will record transform feedback varyings from the beginning
// of the buffer.
bool mRebindTransformFeedbackBuffer;
gl::TransformFeedbackBuffersArray<vk::BufferHelper *> mBufferHelpers;
gl::TransformFeedbackBuffersArray<VkBuffer> mBufferHandles;
gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferOffsets;
gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferSizes;
// Counter buffer used for pause and resume.
gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBufferHelpers;
gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles;
gl::TransformFeedbackBuffersArray<VkDeviceSize> mCounterBufferOffsets;
// Keys to look up in the descriptor set cache
vk::DescriptorSetDesc mXFBBuffersDesc;
// Buffer binding points
std::vector<angle::ObserverBinding> mBufferObserverBindings;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_VULKAN_TRANSFORMFEEDBACKVK_H_