Commit 8270ebbd by Jamie Madill Committed by Commit Bot

Vulkan: Refactor and clean up XFB code.

This is a refactor-only change mostly. It makes the classes work more similarly to how the other classes in the Vk back-end work. Also removes some redundant code. Moves the buffer caching into begin for a more dirty-bits like approach. Bug: angleproject:4622 Change-Id: I34ac13e1d05b48e3267937c760d195493a76ed02 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2191172 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarTim Van Patten <timvp@google.com>
parent ab8d424a
...@@ -1435,29 +1435,27 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation( ...@@ -1435,29 +1435,27 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersEmulation(
const gl::ProgramExecutable *executable = mState.getProgramExecutable(); const gl::ProgramExecutable *executable = mState.getProgramExecutable();
ASSERT(executable); ASSERT(executable);
if (executable->hasTransformFeedbackOutput() && mState.isTransformFeedbackActive()) if (!executable->hasTransformFeedbackOutput() || !mState.isTransformFeedbackActive())
{ {
return angle::Result::Continue;
}
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback());
size_t bufferCount = executable->getTransformFeedbackBufferCount(mState); size_t bufferCount = executable->getTransformFeedbackBufferCount(mState);
const std::vector<gl::OffsetBindingPointer<gl::Buffer>> &xfbBuffers = const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &bufferHelpers =
mState.getCurrentTransformFeedback()->getIndexedBuffers(); transformFeedbackVk->getBufferHelpers();
for (size_t bufferIndex = 0; bufferIndex < bufferCount; ++bufferIndex) for (size_t bufferIndex = 0; bufferIndex < bufferCount; ++bufferIndex)
{ {
const gl::OffsetBindingPointer<gl::Buffer> &xfbBuffer = xfbBuffers[bufferIndex]; vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
gl::Buffer *buffer = xfbBuffer.get(); ASSERT(bufferHelper);
ASSERT(buffer != nullptr);
BufferVk *bufferVk = vk::GetImpl(buffer);
vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
mRenderPassCommands.bufferWrite(&mResourceUseList, VK_ACCESS_SHADER_WRITE_BIT, mRenderPassCommands.bufferWrite(&mResourceUseList, VK_ACCESS_SHADER_WRITE_BIT,
vk::PipelineStage::VertexShader, &bufferHelper); vk::PipelineStage::VertexShader, bufferHelper);
} }
// TODO(http://anglebug.com/3570): Need to update to handle Program Pipelines // TODO(http://anglebug.com/3570): Need to update to handle Program Pipelines
ANGLE_TRY(mProgram->getExecutable().updateTransformFeedbackDescriptorSet( return mProgram->getExecutable().updateTransformFeedbackDescriptorSet(
mProgram->getState(), mProgram->getDefaultUniformBlocks(), this)); mProgram->getState(), mProgram->getDefaultUniformBlocks(), this);
}
return angle::Result::Continue;
} }
angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension( angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
...@@ -1470,36 +1468,31 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension( ...@@ -1470,36 +1468,31 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackBuffersExtension(
if (!executable->hasTransformFeedbackOutput() || !mState.isTransformFeedbackActive()) if (!executable->hasTransformFeedbackOutput() || !mState.isTransformFeedbackActive())
return angle::Result::Continue; return angle::Result::Continue;
size_t bufferIndex = 0;
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback()); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback());
size_t bufferCount = executable->getTransformFeedbackBufferCount(mState); size_t bufferCount = executable->getTransformFeedbackBufferCount(mState);
gl::TransformFeedbackBuffersArray<VkBuffer> bufferHandles;
const std::vector<gl::OffsetBindingPointer<gl::Buffer>> &xfbBuffers = const gl::TransformFeedbackBuffersArray<vk::BufferHelper *> &bufferHelpers =
mState.getCurrentTransformFeedback()->getIndexedBuffers(); transformFeedbackVk->getBufferHelpers();
for (bufferIndex = 0; bufferIndex < bufferCount; ++bufferIndex) for (size_t bufferIndex = 0; bufferIndex < bufferCount; ++bufferIndex)
{ {
const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = xfbBuffers[bufferIndex]; vk::BufferHelper *bufferHelper = bufferHelpers[bufferIndex];
gl::Buffer *buffer = bufferBinding.get(); ASSERT(bufferHelper);
ASSERT(buffer != nullptr);
BufferVk *bufferVk = vk::GetImpl(buffer);
vk::BufferHelper &bufferHelper = bufferVk->getBuffer();
bufferHandles[bufferIndex] = bufferHelper.getBuffer().getHandle();
mRenderPassCommands.bufferWrite(&mResourceUseList, mRenderPassCommands.bufferWrite(&mResourceUseList,
VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT,
vk::PipelineStage::TransformFeedback, &bufferHelper); vk::PipelineStage::TransformFeedback, bufferHelper);
} }
const TransformFeedbackBufferRange &xfbBufferRangeExtension = const gl::TransformFeedbackBuffersArray<VkBuffer> &bufferHandles =
transformFeedbackVk->getTransformFeedbackBufferRange(); transformFeedbackVk->getBufferHandles();
const gl::TransformFeedbackBuffersArray<VkDeviceSize> &bufferOffsets =
transformFeedbackVk->getBufferOffsets();
const gl::TransformFeedbackBuffersArray<VkDeviceSize> &bufferSizes =
transformFeedbackVk->getBufferSizes();
commandBuffer->bindTransformFeedbackBuffers( commandBuffer->bindTransformFeedbackBuffers(static_cast<uint32_t>(bufferCount),
static_cast<uint32_t>(bufferCount), bufferHandles.data(), bufferHandles.data(), bufferOffsets.data(),
xfbBufferRangeExtension.offsets.data(), xfbBufferRangeExtension.sizes.data()); bufferSizes.data());
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -1511,7 +1504,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con ...@@ -1511,7 +1504,9 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con
ASSERT(executable); ASSERT(executable);
if (!executable->hasTransformFeedbackOutput() || !mState.isTransformFeedbackActiveUnpaused()) if (!executable->hasTransformFeedbackOutput() || !mState.isTransformFeedbackActiveUnpaused())
{
return angle::Result::Continue; return angle::Result::Continue;
}
TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback()); TransformFeedbackVk *transformFeedbackVk = vk::GetImpl(mState.getCurrentTransformFeedback());
...@@ -1520,12 +1515,10 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con ...@@ -1520,12 +1515,10 @@ angle::Result ContextVk::handleDirtyGraphicsTransformFeedbackState(const gl::Con
const gl::TransformFeedbackBuffersArray<VkBuffer> &counterBufferHandles = const gl::TransformFeedbackBuffersArray<VkBuffer> &counterBufferHandles =
transformFeedbackVk->getCounterBufferHandles(); transformFeedbackVk->getCounterBufferHandles();
bool rebindBuffer = transformFeedbackVk->getTransformFeedbackBufferRebindState(); bool rebindBuffers = transformFeedbackVk->getAndResetBufferRebindState();
mRenderPassCommands.beginTransformFeedback(bufferCount, counterBufferHandles.data(), mRenderPassCommands.beginTransformFeedback(bufferCount, counterBufferHandles.data(),
rebindBuffer); rebindBuffers);
transformFeedbackVk->unsetTransformFeedbackBufferRebindState();
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -3191,16 +3184,11 @@ void ContextVk::invalidateCurrentTransformFeedbackBuffers() ...@@ -3191,16 +3184,11 @@ void ContextVk::invalidateCurrentTransformFeedbackBuffers()
} }
} }
void ContextVk::invalidateCurrentTransformFeedbackState()
{
mGraphicsDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_STATE);
}
void ContextVk::onTransformFeedbackStateChanged() void ContextVk::onTransformFeedbackStateChanged()
{ {
if (getFeatures().supportsTransformFeedbackExtension.enabled) if (getFeatures().supportsTransformFeedbackExtension.enabled)
{ {
invalidateCurrentTransformFeedbackState(); mGraphicsDirtyBits.set(DIRTY_BIT_TRANSFORM_FEEDBACK_STATE);
} }
else if (getFeatures().emulateTransformFeedback.enabled) else if (getFeatures().emulateTransformFeedback.enabled)
{ {
......
...@@ -327,7 +327,6 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -327,7 +327,6 @@ class ContextVk : public ContextImpl, public vk::Context
void onHostVisibleBufferWrite() { mIsAnyHostVisibleBufferWritten = true; } void onHostVisibleBufferWrite() { mIsAnyHostVisibleBufferWritten = true; }
void invalidateCurrentTransformFeedbackBuffers(); void invalidateCurrentTransformFeedbackBuffers();
void invalidateCurrentTransformFeedbackState();
void onTransformFeedbackStateChanged(); void onTransformFeedbackStateChanged();
// When UtilsVk issues draw or dispatch calls, it binds descriptor sets that the context is not // When UtilsVk issues draw or dispatch calls, it binds descriptor sets that the context is not
......
...@@ -24,10 +24,15 @@ namespace rx ...@@ -24,10 +24,15 @@ namespace rx
{ {
TransformFeedbackVk::TransformFeedbackVk(const gl::TransformFeedbackState &state) TransformFeedbackVk::TransformFeedbackVk(const gl::TransformFeedbackState &state)
: TransformFeedbackImpl(state), mRebindTransformFeedbackBuffer(false) : TransformFeedbackImpl(state),
{ mRebindTransformFeedbackBuffer(false),
mCounterBufferHandles.fill(0); mBufferHelpers{},
} mBufferHandles{},
mBufferOffsets{},
mBufferSizes{},
mAlignedBufferOffsets{},
mCounterBufferHandles{}
{}
TransformFeedbackVk::~TransformFeedbackVk() {} TransformFeedbackVk::~TransformFeedbackVk() {}
...@@ -35,7 +40,7 @@ void TransformFeedbackVk::onDestroy(const gl::Context *context) ...@@ -35,7 +40,7 @@ void TransformFeedbackVk::onDestroy(const gl::Context *context)
{ {
RendererVk *rendererVk = vk::GetImpl(context)->getRenderer(); RendererVk *rendererVk = vk::GetImpl(context)->getRenderer();
for (vk::BufferHelper &bufferHelper : mCounterBuffer) for (vk::BufferHelper &bufferHelper : mCounterBufferHelpers)
{ {
bufferHelper.release(rendererVk); bufferHelper.release(rendererVk);
} }
...@@ -48,6 +53,53 @@ angle::Result TransformFeedbackVk::begin(const gl::Context *context, ...@@ -48,6 +53,53 @@ angle::Result TransformFeedbackVk::begin(const gl::Context *context,
contextVk->onTransformFeedbackStateChanged(); contextVk->onTransformFeedbackStateChanged();
const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable();
ASSERT(executable);
size_t xfbBufferCount = executable->getTransformFeedbackBufferCount(contextVk->getState());
for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex)
{
const gl::OffsetBindingPointer<gl::Buffer> &binding = mState.getIndexedBuffer(bufferIndex);
ASSERT(binding.get());
mBufferHelpers[bufferIndex] = &vk::GetImpl(binding.get())->getBuffer();
mBufferHandles[bufferIndex] = mBufferHelpers[bufferIndex]->getBuffer().getHandle();
mBufferOffsets[bufferIndex] = binding.getOffset();
mBufferSizes[bufferIndex] = gl::GetBoundBufferAvailableSize(binding);
if (contextVk->getFeatures().supportsTransformFeedbackExtension.enabled)
{
if (mCounterBufferHandles[bufferIndex] == VK_NULL_HANDLE)
{
VkBufferCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
createInfo.size = 16;
createInfo.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
createInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
vk::BufferHelper &bufferHelper = mCounterBufferHelpers[bufferIndex];
ANGLE_TRY(
bufferHelper.init(contextVk, createInfo, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
mCounterBufferHandles[bufferIndex] = bufferHelper.getBuffer().getHandle();
}
}
else
{
ASSERT(contextVk->getFeatures().emulateTransformFeedback.enabled);
RendererVk *rendererVk = contextVk->getRenderer();
const VkDeviceSize offsetAlignment =
rendererVk->getPhysicalDeviceProperties().limits.minStorageBufferOffsetAlignment;
// Make sure there's no possible under/overflow with binding size.
static_assert(sizeof(VkDeviceSize) >= sizeof(binding.getSize()),
"VkDeviceSize too small");
// Set the offset as close as possible to the requested offset while remaining aligned.
mAlignedBufferOffsets[bufferIndex] =
(mBufferOffsets[bufferIndex] / offsetAlignment) * offsetAlignment;
}
}
if (contextVk->getFeatures().supportsTransformFeedbackExtension.enabled) if (contextVk->getFeatures().supportsTransformFeedbackExtension.enabled)
{ {
mRebindTransformFeedbackBuffer = true; mRebindTransformFeedbackBuffer = true;
...@@ -113,50 +165,9 @@ angle::Result TransformFeedbackVk::bindIndexedBuffer( ...@@ -113,50 +165,9 @@ angle::Result TransformFeedbackVk::bindIndexedBuffer(
{ {
ContextVk *contextVk = vk::GetImpl(context); ContextVk *contextVk = vk::GetImpl(context);
if (contextVk->getFeatures().supportsTransformFeedbackExtension.enabled)
{
// Save xfb buffer state
mTransformFeedbackBufferRange.offsets[index] = binding.getOffset();
mTransformFeedbackBufferRange.sizes[index] =
(binding.getSize()) ? binding.getSize() : VK_WHOLE_SIZE;
mRebindTransformFeedbackBuffer = true;
if (mCounterBufferHandles[index] == 0)
{
VkBufferCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
createInfo.size = 16;
createInfo.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
createInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
ANGLE_TRY(mCounterBuffer[index].init(contextVk, createInfo,
VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT));
mCounterBufferHandles[index] = mCounterBuffer[index].getBuffer().getHandle();
}
// Set dirty bit for update xfb buffer
contextVk->invalidateCurrentTransformFeedbackBuffers();
}
else if (contextVk->getFeatures().emulateTransformFeedback.enabled)
{
RendererVk *rendererVk = vk::GetImpl(context)->getRenderer();
const VkDeviceSize offsetAlignment =
rendererVk->getPhysicalDeviceProperties().limits.minStorageBufferOffsetAlignment;
// Make sure there's no possible under/overflow with binding size.
static_assert(sizeof(VkDeviceSize) >= sizeof(binding.getSize()), "VkDeviceSize too small");
mTransformFeedbackBufferRange.offsets[index] = binding.getOffset();
mTransformFeedbackBufferRange.sizes[index] = gl::GetBoundBufferAvailableSize(binding);
// Set the offset as close as possible to the requested offset while remaining aligned.
mTransformFeedbackBufferRange.alignedOffsets[index] =
(mTransformFeedbackBufferRange.offsets[index] / offsetAlignment) * offsetAlignment;
// Make sure the transform feedback buffers are bound to the program descriptor sets. // Make sure the transform feedback buffers are bound to the program descriptor sets.
contextVk->invalidateCurrentTransformFeedbackBuffers(); contextVk->invalidateCurrentTransformFeedbackBuffers();
}
return angle::Result::Continue; return angle::Result::Continue;
} }
...@@ -187,8 +198,7 @@ void TransformFeedbackVk::initDescriptorSet(ContextVk *contextVk, ...@@ -187,8 +198,7 @@ void TransformFeedbackVk::initDescriptorSet(ContextVk *contextVk,
if (!contextVk->getFeatures().emulateTransformFeedback.enabled) if (!contextVk->getFeatures().emulateTransformFeedback.enabled)
return; return;
std::array<VkDescriptorBufferInfo, gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS> gl::TransformFeedbackBuffersArray<VkDescriptorBufferInfo> descriptorBufferInfo;
descriptorBufferInfo;
for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex) for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex)
{ {
...@@ -208,8 +218,6 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk, ...@@ -208,8 +218,6 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk,
if (!contextVk->getFeatures().emulateTransformFeedback.enabled) if (!contextVk->getFeatures().emulateTransformFeedback.enabled)
return; return;
const std::vector<gl::OffsetBindingPointer<gl::Buffer>> &xfbBuffers =
mState.getIndexedBuffers();
const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable(); const gl::ProgramExecutable *executable = contextVk->getState().getProgramExecutable();
ASSERT(executable); ASSERT(executable);
size_t xfbBufferCount = executable->getTransformFeedbackBufferCount(contextVk->getState()); size_t xfbBufferCount = executable->getTransformFeedbackBufferCount(contextVk->getState());
...@@ -218,26 +226,18 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk, ...@@ -218,26 +226,18 @@ void TransformFeedbackVk::updateDescriptorSet(ContextVk *contextVk,
ASSERT(programState.getTransformFeedbackBufferMode() != GL_INTERLEAVED_ATTRIBS || ASSERT(programState.getTransformFeedbackBufferMode() != GL_INTERLEAVED_ATTRIBS ||
xfbBufferCount == 1); xfbBufferCount == 1);
std::array<VkDescriptorBufferInfo, gl::IMPLEMENTATION_MAX_TRANSFORM_FEEDBACK_BUFFERS> gl::TransformFeedbackBuffersArray<VkDescriptorBufferInfo> descriptorBufferInfo;
descriptorBufferInfo;
// Update buffer descriptor binding info for output buffers // Update buffer descriptor binding info for output buffers
for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex) for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex)
{ {
VkDescriptorBufferInfo &bufferInfo = descriptorBufferInfo[bufferIndex]; VkDescriptorBufferInfo &bufferInfo = descriptorBufferInfo[bufferIndex];
const gl::OffsetBindingPointer<gl::Buffer> &bufferBinding = xfbBuffers[bufferIndex]; bufferInfo.buffer = mBufferHandles[bufferIndex];
gl::Buffer *buffer = bufferBinding.get(); bufferInfo.offset = mAlignedBufferOffsets[bufferIndex];
ASSERT(buffer != nullptr); bufferInfo.range = mBufferSizes[bufferIndex] +
(mBufferOffsets[bufferIndex] - mAlignedBufferOffsets[bufferIndex]);
vk::BufferHelper &bufferHelper = vk::GetImpl(buffer)->getBuffer(); ASSERT(bufferInfo.range != 0);
bufferInfo.buffer = bufferHelper.getBuffer().getHandle();
bufferInfo.offset = mTransformFeedbackBufferRange.alignedOffsets[bufferIndex];
bufferInfo.range = mTransformFeedbackBufferRange.sizes[bufferIndex] +
(mTransformFeedbackBufferRange.offsets[bufferIndex] -
mTransformFeedbackBufferRange.alignedOffsets[bufferIndex]);
bufferInfo.range = (bufferInfo.range == 0) ? bufferHelper.getSize() : bufferInfo.range;
} }
writeDescriptorSet(contextVk, xfbBufferCount, descriptorBufferInfo.data(), descSet); writeDescriptorSet(contextVk, xfbBufferCount, descriptorBufferInfo.data(), descSet);
...@@ -267,8 +267,7 @@ void TransformFeedbackVk::getBufferOffsets(ContextVk *contextVk, ...@@ -267,8 +267,7 @@ void TransformFeedbackVk::getBufferOffsets(ContextVk *contextVk,
for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex) for (size_t bufferIndex = 0; bufferIndex < xfbBufferCount; ++bufferIndex)
{ {
int64_t offsetFromDescriptor = int64_t offsetFromDescriptor =
static_cast<int64_t>(mTransformFeedbackBufferRange.offsets[bufferIndex] - static_cast<int64_t>(mBufferOffsets[bufferIndex] - mAlignedBufferOffsets[bufferIndex]);
mTransformFeedbackBufferRange.alignedOffsets[bufferIndex]);
int64_t drawCallVertexOffset = static_cast<int64_t>(verticesDrawn) - drawCallFirstVertex; int64_t drawCallVertexOffset = static_cast<int64_t>(verticesDrawn) - drawCallFirstVertex;
int64_t writeOffset = int64_t writeOffset =
......
...@@ -27,18 +27,6 @@ namespace vk ...@@ -27,18 +27,6 @@ namespace vk
class DescriptorSetLayoutDesc; class DescriptorSetLayoutDesc;
} }
// Cached buffer properties for faster descriptor set update and offset calculation.
struct TransformFeedbackBufferRange
{
// Offset as provided by OffsetBindingPointer.
gl::TransformFeedbackBuffersArray<VkDeviceSize> offsets;
// Size as provided by OffsetBindingPointer.
gl::TransformFeedbackBuffersArray<VkDeviceSize> sizes;
// Aligned offset usable for VkDescriptorBufferInfo. This value could be smaller than
// offset.
gl::TransformFeedbackBuffersArray<VkDeviceSize> alignedOffsets;
};
class TransformFeedbackVk : public TransformFeedbackImpl class TransformFeedbackVk : public TransformFeedbackImpl
{ {
public: public:
...@@ -71,13 +59,31 @@ class TransformFeedbackVk : public TransformFeedbackImpl ...@@ -71,13 +59,31 @@ class TransformFeedbackVk : public TransformFeedbackImpl
int32_t *offsetsOut, int32_t *offsetsOut,
size_t offsetsSize) const; size_t offsetsSize) const;
void unsetTransformFeedbackBufferRebindState() { mRebindTransformFeedbackBuffer = false; } 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;
}
bool getTransformFeedbackBufferRebindState() const { return mRebindTransformFeedbackBuffer; } const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferOffsets() const
{
return mBufferOffsets;
}
const TransformFeedbackBufferRange &getTransformFeedbackBufferRange() const const gl::TransformFeedbackBuffersArray<VkDeviceSize> &getBufferSizes() const
{ {
return mTransformFeedbackBufferRange; return mBufferSizes;
} }
const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const const gl::TransformFeedbackBuffersArray<VkBuffer> &getCounterBufferHandles() const
...@@ -97,9 +103,17 @@ class TransformFeedbackVk : public TransformFeedbackImpl ...@@ -97,9 +103,17 @@ class TransformFeedbackVk : public TransformFeedbackImpl
// value is true, vertex shader will record transform feedback varyings from the beginning // value is true, vertex shader will record transform feedback varyings from the beginning
// of the buffer. // of the buffer.
bool mRebindTransformFeedbackBuffer; bool mRebindTransformFeedbackBuffer;
TransformFeedbackBufferRange mTransformFeedbackBufferRange;
gl::TransformFeedbackBuffersArray<vk::BufferHelper *> mBufferHelpers;
gl::TransformFeedbackBuffersArray<VkBuffer> mBufferHandles;
gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferOffsets;
gl::TransformFeedbackBuffersArray<VkDeviceSize> mBufferSizes;
// Aligned offset for emulation. Could be smaller than offset.
gl::TransformFeedbackBuffersArray<VkDeviceSize> mAlignedBufferOffsets;
// Counter buffer used for pause and resume. // Counter buffer used for pause and resume.
gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBuffer; gl::TransformFeedbackBuffersArray<vk::BufferHelper> mCounterBufferHelpers;
gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles; gl::TransformFeedbackBuffersArray<VkBuffer> mCounterBufferHandles;
}; };
......
...@@ -660,11 +660,11 @@ void CommandBufferHelper::beginRenderPass(const vk::Framebuffer &framebuffer, ...@@ -660,11 +660,11 @@ void CommandBufferHelper::beginRenderPass(const vk::Framebuffer &framebuffer,
void CommandBufferHelper::beginTransformFeedback(size_t validBufferCount, void CommandBufferHelper::beginTransformFeedback(size_t validBufferCount,
const VkBuffer *counterBuffers, const VkBuffer *counterBuffers,
bool rebindBuffer) bool rebindBuffers)
{ {
ASSERT(mIsRenderPassCommandBuffer); ASSERT(mIsRenderPassCommandBuffer);
mValidTransformFeedbackBufferCount = static_cast<uint32_t>(validBufferCount); mValidTransformFeedbackBufferCount = static_cast<uint32_t>(validBufferCount);
mRebindTransformFeedbackBuffers = rebindBuffer; mRebindTransformFeedbackBuffers = rebindBuffers;
for (size_t index = 0; index < validBufferCount; index++) for (size_t index = 0; index < validBufferCount; index++)
{ {
......
...@@ -890,7 +890,7 @@ struct CommandBufferHelper : angle::NonCopyable ...@@ -890,7 +890,7 @@ struct CommandBufferHelper : angle::NonCopyable
void beginTransformFeedback(size_t validBufferCount, void beginTransformFeedback(size_t validBufferCount,
const VkBuffer *counterBuffers, const VkBuffer *counterBuffers,
bool rebindBuffer); bool rebindBuffers);
void invalidateRenderPassColorAttachment(size_t attachmentIndex) void invalidateRenderPassColorAttachment(size_t attachmentIndex)
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment