Commit f7b607c6 by Mohan Maiya Committed by Commit Bot

Vulkan: Optimize atomic counter buffer offset calculations

Call writeAtomicCounterBufferDriverUniformOffsets method only if there are valid atomic counter buffers Bug: angleproject:3566 Change-Id: I03c3fd2095e30381597bfc66acae0ccbf828d401 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2383787 Commit-Queue: Mohan Maiya <m.maiya@samsung.com> Reviewed-by: 's avatarback sept 10 - Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarShahbaz Youssefi <syoussefi@chromium.org>
parent e1e6f294
......@@ -443,6 +443,7 @@ void State::initialize(Context *context)
caps.maxCombinedTextureImageUnits);
mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
mValidAtomicCounterBufferCount = 0;
mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
mImageUnits.resize(caps.maxImageUnits);
}
......@@ -565,6 +566,7 @@ void State::reset(const Context *context)
{
UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
}
mValidAtomicCounterBufferCount = 0;
for (OffsetBindingPointer<Buffer> &buf : mShaderStorageBuffers)
{
......@@ -1973,6 +1975,10 @@ angle::Result State::setIndexedBufferBinding(const Context *context,
case BufferBinding::AtomicCounter:
UpdateIndexedBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target,
offset, size);
if (buffer)
{
mValidAtomicCounterBufferCount++;
}
break;
case BufferBinding::ShaderStorage:
UpdateIndexedBufferBinding(context, &mShaderStorageBuffers[index], buffer, target,
......@@ -2044,6 +2050,7 @@ angle::Result State::detachBuffer(Context *context, const Buffer *buffer)
if (buf.id() == bufferID)
{
UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
mValidAtomicCounterBufferCount--;
}
}
......
......@@ -431,6 +431,11 @@ class State : angle::NonCopyable
size_t getAtomicCounterBufferCount() const { return mAtomicCounterBuffers.size(); }
ANGLE_INLINE bool hasValidAtomicCounterBuffer() const
{
return mValidAtomicCounterBufferCount > 0;
}
const OffsetBindingPointer<Buffer> &getIndexedUniformBuffer(size_t index) const;
const OffsetBindingPointer<Buffer> &getIndexedAtomicCounterBuffer(size_t index) const;
const OffsetBindingPointer<Buffer> &getIndexedShaderStorageBuffer(size_t index) const;
......@@ -1029,6 +1034,7 @@ class State : angle::NonCopyable
BufferVector mUniformBuffers;
BufferVector mAtomicCounterBuffers;
size_t mValidAtomicCounterBufferCount;
BufferVector mShaderStorageBuffers;
BindingPointer<TransformFeedback> mTransformFeedback;
......
......@@ -3755,8 +3755,11 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co
driverUniforms->xfbBufferOffsets.size());
}
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size());
if (mState.hasValidAtomicCounterBuffer())
{
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size());
}
return updateDriverUniformsDescriptorSet(newBuffer, sizeof(GraphicsDriverUniforms),
&mDriverUniforms[PipelineType::Graphics]);
......@@ -3775,8 +3778,11 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con
ComputeDriverUniforms *driverUniforms = reinterpret_cast<ComputeDriverUniforms *>(ptr);
*driverUniforms = {};
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size());
if (mState.hasValidAtomicCounterBuffer())
{
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size());
}
return updateDriverUniformsDescriptorSet(newBuffer, sizeof(ComputeDriverUniforms),
&mDriverUniforms[PipelineType::Compute]);
......
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