Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit f7b607c

Browse files
Mohan MaiyaCommit Bot
authored andcommitted
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 <[email protected]> Reviewed-by: back sept 10 - Jamie Madill <[email protected]> Reviewed-by: Shahbaz Youssefi <[email protected]>
1 parent e1e6f29 commit f7b607c

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

src/libANGLE/State.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -443,6 +443,7 @@ void State::initialize(Context *context)
443443
caps.maxCombinedTextureImageUnits);
444444

445445
mAtomicCounterBuffers.resize(caps.maxAtomicCounterBufferBindings);
446+
mValidAtomicCounterBufferCount = 0;
446447
mShaderStorageBuffers.resize(caps.maxShaderStorageBufferBindings);
447448
mImageUnits.resize(caps.maxImageUnits);
448449
}
@@ -565,6 +566,7 @@ void State::reset(const Context *context)
565566
{
566567
UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
567568
}
569+
mValidAtomicCounterBufferCount = 0;
568570

569571
for (OffsetBindingPointer<Buffer> &buf : mShaderStorageBuffers)
570572
{
@@ -1973,6 +1975,10 @@ angle::Result State::setIndexedBufferBinding(const Context *context,
19731975
case BufferBinding::AtomicCounter:
19741976
UpdateIndexedBufferBinding(context, &mAtomicCounterBuffers[index], buffer, target,
19751977
offset, size);
1978+
if (buffer)
1979+
{
1980+
mValidAtomicCounterBufferCount++;
1981+
}
19761982
break;
19771983
case BufferBinding::ShaderStorage:
19781984
UpdateIndexedBufferBinding(context, &mShaderStorageBuffers[index], buffer, target,
@@ -2044,6 +2050,7 @@ angle::Result State::detachBuffer(Context *context, const Buffer *buffer)
20442050
if (buf.id() == bufferID)
20452051
{
20462052
UpdateIndexedBufferBinding(context, &buf, nullptr, BufferBinding::AtomicCounter, 0, 0);
2053+
mValidAtomicCounterBufferCount--;
20472054
}
20482055
}
20492056

src/libANGLE/State.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,6 +431,11 @@ class State : angle::NonCopyable
431431

432432
size_t getAtomicCounterBufferCount() const { return mAtomicCounterBuffers.size(); }
433433

434+
ANGLE_INLINE bool hasValidAtomicCounterBuffer() const
435+
{
436+
return mValidAtomicCounterBufferCount > 0;
437+
}
438+
434439
const OffsetBindingPointer<Buffer> &getIndexedUniformBuffer(size_t index) const;
435440
const OffsetBindingPointer<Buffer> &getIndexedAtomicCounterBuffer(size_t index) const;
436441
const OffsetBindingPointer<Buffer> &getIndexedShaderStorageBuffer(size_t index) const;
@@ -1029,6 +1034,7 @@ class State : angle::NonCopyable
10291034

10301035
BufferVector mUniformBuffers;
10311036
BufferVector mAtomicCounterBuffers;
1037+
size_t mValidAtomicCounterBufferCount;
10321038
BufferVector mShaderStorageBuffers;
10331039

10341040
BindingPointer<TransformFeedback> mTransformFeedback;

src/libANGLE/renderer/vulkan/ContextVk.cpp

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3755,8 +3755,11 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co
37553755
driverUniforms->xfbBufferOffsets.size());
37563756
}
37573757

3758-
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
3759-
driverUniforms->acbBufferOffsets.size());
3758+
if (mState.hasValidAtomicCounterBuffer())
3759+
{
3760+
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
3761+
driverUniforms->acbBufferOffsets.size());
3762+
}
37603763

37613764
return updateDriverUniformsDescriptorSet(newBuffer, sizeof(GraphicsDriverUniforms),
37623765
&mDriverUniforms[PipelineType::Graphics]);
@@ -3775,8 +3778,11 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con
37753778
ComputeDriverUniforms *driverUniforms = reinterpret_cast<ComputeDriverUniforms *>(ptr);
37763779
*driverUniforms = {};
37773780

3778-
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
3779-
driverUniforms->acbBufferOffsets.size());
3781+
if (mState.hasValidAtomicCounterBuffer())
3782+
{
3783+
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
3784+
driverUniforms->acbBufferOffsets.size());
3785+
}
37803786

37813787
return updateDriverUniformsDescriptorSet(newBuffer, sizeof(ComputeDriverUniforms),
37823788
&mDriverUniforms[PipelineType::Compute]);

0 commit comments

Comments
 (0)