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) ...@@ -443,6 +443,7 @@ void State::initialize(Context *context)
caps.maxCombinedTextureImageUnits); caps.maxCombinedTextureImageUnits);
mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings); mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
mValidAtomicCounterBufferCount = 0;
mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings); mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
mImageUnits.resize(caps.maxImageUnits); mImageUnits.resize(caps.maxImageUnits);
} }
...@@ -565,6 +566,7 @@ void State::reset(const Context *context) ...@@ -565,6 +566,7 @@ void State::reset(const Context *context)
{ {
UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0); UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
} }
mValidAtomicCounterBufferCount = 0;
for (OffsetBindingPointer<Buffer> &buf : mShaderStorageBuffers) for (OffsetBindingPointer<Buffer> &buf : mShaderStorageBuffers)
{ {
...@@ -1973,6 +1975,10 @@ angle::Result State::setIndexedBufferBinding(const Context *context, ...@@ -1973,6 +1975,10 @@ angle::Result State::setIndexedBufferBinding(const Context *context,
case BufferBinding::AtomicCounter: case BufferBinding::AtomicCounter:
UpdateIndexedBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target, UpdateIndexedBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target,
offset, size); offset, size);
if (buffer)
{
mValidAtomicCounterBufferCount++;
}
break; break;
case BufferBinding::ShaderStorage: case BufferBinding::ShaderStorage:
UpdateIndexedBufferBinding(context, &mShaderStorageBuffers[index], buffer, target, UpdateIndexedBufferBinding(context, &mShaderStorageBuffers[index], buffer, target,
...@@ -2044,6 +2050,7 @@ angle::Result State::detachBuffer(Context *context, const Buffer *buffer) ...@@ -2044,6 +2050,7 @@ angle::Result State::detachBuffer(Context *context, const Buffer *buffer)
if (buf.id() == bufferID) if (buf.id() == bufferID)
{ {
UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0); UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
mValidAtomicCounterBufferCount--;
} }
} }
......
...@@ -431,6 +431,11 @@ class State : angle::NonCopyable ...@@ -431,6 +431,11 @@ class State : angle::NonCopyable
size_t getAtomicCounterBufferCount() const { return mAtomicCounterBuffers.size(); } 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> &getIndexedUniformBuffer(size_t index) const;
const OffsetBindingPointer<Buffer> &getIndexedAtomicCounterBuffer(size_t index) const; const OffsetBindingPointer<Buffer> &getIndexedAtomicCounterBuffer(size_t index) const;
const OffsetBindingPointer<Buffer> &getIndexedShaderStorageBuffer(size_t index) const; const OffsetBindingPointer<Buffer> &getIndexedShaderStorageBuffer(size_t index) const;
...@@ -1029,6 +1034,7 @@ class State : angle::NonCopyable ...@@ -1029,6 +1034,7 @@ class State : angle::NonCopyable
BufferVector mUniformBuffers; BufferVector mUniformBuffers;
BufferVector mAtomicCounterBuffers; BufferVector mAtomicCounterBuffers;
size_t mValidAtomicCounterBufferCount;
BufferVector mShaderStorageBuffers; BufferVector mShaderStorageBuffers;
BindingPointer<TransformFeedback> mTransformFeedback; BindingPointer<TransformFeedback> mTransformFeedback;
......
...@@ -3755,8 +3755,11 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co ...@@ -3755,8 +3755,11 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co
driverUniforms->xfbBufferOffsets.size()); driverUniforms->xfbBufferOffsets.size());
} }
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(), if (mState.hasValidAtomicCounterBuffer())
driverUniforms->acbBufferOffsets.size()); {
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size());
}
return updateDriverUniformsDescriptorSet(newBuffer, sizeof(GraphicsDriverUniforms), return updateDriverUniformsDescriptorSet(newBuffer, sizeof(GraphicsDriverUniforms),
&mDriverUniforms[PipelineType::Graphics]); &mDriverUniforms[PipelineType::Graphics]);
...@@ -3775,8 +3778,11 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con ...@@ -3775,8 +3778,11 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con
ComputeDriverUniforms *driverUniforms = reinterpret_cast<ComputeDriverUniforms *>(ptr); ComputeDriverUniforms *driverUniforms = reinterpret_cast<ComputeDriverUniforms *>(ptr);
*driverUniforms = {}; *driverUniforms = {};
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(), if (mState.hasValidAtomicCounterBuffer())
driverUniforms->acbBufferOffsets.size()); {
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size());
}
return updateDriverUniformsDescriptorSet(newBuffer, sizeof(ComputeDriverUniforms), return updateDriverUniformsDescriptorSet(newBuffer, sizeof(ComputeDriverUniforms),
&mDriverUniforms[PipelineType::Compute]); &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