Commit afdea864 by Charlie Lao Committed by Commit Bot

Vulkan: Add cache for driver uniform descriptor set

As we have done for default uniforms and textures, we should cache descriptorset for driver uniforms to avoid repeatedly create them. Bug: b/161750230 Change-Id: I0afabb226d5a8e8c7838fa2484ec7f9689ed5fa0 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/2309349Reviewed-by: 's avatarTim Van Patten <timvp@google.com> Reviewed-by: 's avatarCourtney Goeltzenleuchter <courtneygo@google.com> Reviewed-by: 's avatarJamie Madill <jmadill@chromium.org> Commit-Queue: Charlie Lao <cclao@google.com>
parent 248119b3
...@@ -297,6 +297,7 @@ void ContextVk::DriverUniformsDescriptorSet::init(RendererVk *rendererVk) ...@@ -297,6 +297,7 @@ void ContextVk::DriverUniformsDescriptorSet::init(RendererVk *rendererVk)
rendererVk->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment); rendererVk->getPhysicalDeviceProperties().limits.minUniformBufferOffsetAlignment);
dynamicBuffer.init(rendererVk, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, minAlignment, dynamicBuffer.init(rendererVk, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, minAlignment,
kDriverUniformsAllocatorPageSize, true); kDriverUniformsAllocatorPageSize, true);
descriptorSetCache.clear();
} }
void ContextVk::DriverUniformsDescriptorSet::destroy(RendererVk *renderer) void ContextVk::DriverUniformsDescriptorSet::destroy(RendererVk *renderer)
...@@ -304,6 +305,7 @@ void ContextVk::DriverUniformsDescriptorSet::destroy(RendererVk *renderer) ...@@ -304,6 +305,7 @@ void ContextVk::DriverUniformsDescriptorSet::destroy(RendererVk *renderer)
descriptorSetLayout.reset(); descriptorSetLayout.reset();
descriptorPoolBinding.reset(); descriptorPoolBinding.reset();
dynamicBuffer.destroy(renderer); dynamicBuffer.destroy(renderer);
descriptorSetCache.clear();
} }
// CommandBatch implementation. // CommandBatch implementation.
...@@ -3550,11 +3552,9 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co ...@@ -3550,11 +3552,9 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co
{ {
// Allocate a new region in the dynamic buffer. // Allocate a new region in the dynamic buffer.
uint8_t *ptr; uint8_t *ptr;
VkBuffer buffer;
bool newBuffer; bool newBuffer;
ANGLE_TRY(allocateDriverUniforms(sizeof(GraphicsDriverUniforms), ANGLE_TRY(allocateDriverUniforms(sizeof(GraphicsDriverUniforms),
&mDriverUniforms[PipelineType::Graphics], &buffer, &ptr, &mDriverUniforms[PipelineType::Graphics], &ptr, &newBuffer));
&newBuffer));
gl::Rectangle glViewport = mState.getViewport(); gl::Rectangle glViewport = mState.getViewport();
float halfRenderAreaWidth = float halfRenderAreaWidth =
...@@ -3642,7 +3642,7 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co ...@@ -3642,7 +3642,7 @@ angle::Result ContextVk::handleDirtyGraphicsDriverUniforms(const gl::Context *co
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(), writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size()); driverUniforms->acbBufferOffsets.size());
return updateDriverUniformsDescriptorSet(buffer, newBuffer, sizeof(GraphicsDriverUniforms), return updateDriverUniformsDescriptorSet(newBuffer, sizeof(GraphicsDriverUniforms),
&mDriverUniforms[PipelineType::Graphics]); &mDriverUniforms[PipelineType::Graphics]);
} }
...@@ -3651,11 +3651,9 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con ...@@ -3651,11 +3651,9 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con
{ {
// Allocate a new region in the dynamic buffer. // Allocate a new region in the dynamic buffer.
uint8_t *ptr; uint8_t *ptr;
VkBuffer buffer;
bool newBuffer; bool newBuffer;
ANGLE_TRY(allocateDriverUniforms(sizeof(ComputeDriverUniforms), ANGLE_TRY(allocateDriverUniforms(sizeof(ComputeDriverUniforms),
&mDriverUniforms[PipelineType::Compute], &buffer, &ptr, &mDriverUniforms[PipelineType::Compute], &ptr, &newBuffer));
&newBuffer));
// Copy and flush to the device. // Copy and flush to the device.
ComputeDriverUniforms *driverUniforms = reinterpret_cast<ComputeDriverUniforms *>(ptr); ComputeDriverUniforms *driverUniforms = reinterpret_cast<ComputeDriverUniforms *>(ptr);
...@@ -3664,7 +3662,7 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con ...@@ -3664,7 +3662,7 @@ angle::Result ContextVk::handleDirtyComputeDriverUniforms(const gl::Context *con
writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(), writeAtomicCounterBufferDriverUniformOffsets(driverUniforms->acbBufferOffsets.data(),
driverUniforms->acbBufferOffsets.size()); driverUniforms->acbBufferOffsets.size());
return updateDriverUniformsDescriptorSet(buffer, newBuffer, sizeof(ComputeDriverUniforms), return updateDriverUniformsDescriptorSet(newBuffer, sizeof(ComputeDriverUniforms),
&mDriverUniforms[PipelineType::Compute]); &mDriverUniforms[PipelineType::Compute]);
} }
...@@ -3698,7 +3696,6 @@ angle::Result ContextVk::handleDirtyComputeDriverUniformsBinding(const gl::Conte ...@@ -3698,7 +3696,6 @@ angle::Result ContextVk::handleDirtyComputeDriverUniformsBinding(const gl::Conte
angle::Result ContextVk::allocateDriverUniforms(size_t driverUniformsSize, angle::Result ContextVk::allocateDriverUniforms(size_t driverUniformsSize,
DriverUniformsDescriptorSet *driverUniforms, DriverUniformsDescriptorSet *driverUniforms,
VkBuffer *bufferOut,
uint8_t **ptrOut, uint8_t **ptrOut,
bool *newBufferOut) bool *newBufferOut)
{ {
...@@ -3707,7 +3704,7 @@ angle::Result ContextVk::allocateDriverUniforms(size_t driverUniformsSize, ...@@ -3707,7 +3704,7 @@ angle::Result ContextVk::allocateDriverUniforms(size_t driverUniformsSize,
// into context's mResourceUseList which will ensure they get tagged with queue serial number // into context's mResourceUseList which will ensure they get tagged with queue serial number
// before moving them into the free list. // before moving them into the free list.
VkDeviceSize offset; VkDeviceSize offset;
ANGLE_TRY(driverUniforms->dynamicBuffer.allocate(this, driverUniformsSize, ptrOut, bufferOut, ANGLE_TRY(driverUniforms->dynamicBuffer.allocate(this, driverUniformsSize, ptrOut, nullptr,
&offset, newBufferOut)); &offset, newBufferOut));
driverUniforms->dynamicOffset = static_cast<uint32_t>(offset); driverUniforms->dynamicOffset = static_cast<uint32_t>(offset);
...@@ -3716,7 +3713,6 @@ angle::Result ContextVk::allocateDriverUniforms(size_t driverUniformsSize, ...@@ -3716,7 +3713,6 @@ angle::Result ContextVk::allocateDriverUniforms(size_t driverUniformsSize,
} }
angle::Result ContextVk::updateDriverUniformsDescriptorSet( angle::Result ContextVk::updateDriverUniformsDescriptorSet(
VkBuffer buffer,
bool newBuffer, bool newBuffer,
size_t driverUniformsSize, size_t driverUniformsSize,
DriverUniformsDescriptorSet *driverUniforms) DriverUniformsDescriptorSet *driverUniforms)
...@@ -3728,6 +3724,16 @@ angle::Result ContextVk::updateDriverUniformsDescriptorSet( ...@@ -3728,6 +3724,16 @@ angle::Result ContextVk::updateDriverUniformsDescriptorSet(
return angle::Result::Continue; return angle::Result::Continue;
} }
const vk::BufferHelper *buffer = driverUniforms->dynamicBuffer.getCurrentBuffer();
BufferSerial bufferSerial = buffer->getBufferSerial();
// Look up in the cache first
auto iter = driverUniforms->descriptorSetCache.find(bufferSerial);
if (iter != driverUniforms->descriptorSetCache.end())
{
driverUniforms->descriptorSet = iter->second;
return angle::Result::Continue;
}
// Allocate a new descriptor set. // Allocate a new descriptor set.
ANGLE_TRY(mDriverUniformsDescriptorPool.allocateSets( ANGLE_TRY(mDriverUniformsDescriptorPool.allocateSets(
this, driverUniforms->descriptorSetLayout.get().ptr(), 1, this, driverUniforms->descriptorSetLayout.get().ptr(), 1,
...@@ -3735,7 +3741,7 @@ angle::Result ContextVk::updateDriverUniformsDescriptorSet( ...@@ -3735,7 +3741,7 @@ angle::Result ContextVk::updateDriverUniformsDescriptorSet(
// Update the driver uniform descriptor set. // Update the driver uniform descriptor set.
VkDescriptorBufferInfo &bufferInfo = allocBufferInfo(); VkDescriptorBufferInfo &bufferInfo = allocBufferInfo();
bufferInfo.buffer = buffer; bufferInfo.buffer = buffer->getBuffer().getHandle();
bufferInfo.offset = 0; bufferInfo.offset = 0;
bufferInfo.range = driverUniformsSize; bufferInfo.range = driverUniformsSize;
...@@ -3750,6 +3756,9 @@ angle::Result ContextVk::updateDriverUniformsDescriptorSet( ...@@ -3750,6 +3756,9 @@ angle::Result ContextVk::updateDriverUniformsDescriptorSet(
writeInfo.pTexelBufferView = nullptr; writeInfo.pTexelBufferView = nullptr;
writeInfo.pBufferInfo = &bufferInfo; writeInfo.pBufferInfo = &bufferInfo;
// Add into descriptor set cache
driverUniforms->descriptorSetCache.emplace(bufferSerial, driverUniforms->descriptorSet);
return angle::Result::Continue; return angle::Result::Continue;
} }
......
...@@ -623,6 +623,7 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -623,6 +623,7 @@ class ContextVk : public ContextImpl, public vk::Context
uint32_t dynamicOffset; uint32_t dynamicOffset;
vk::BindingPointer<vk::DescriptorSetLayout> descriptorSetLayout; vk::BindingPointer<vk::DescriptorSetLayout> descriptorSetLayout;
vk::RefCountedDescriptorPoolBinding descriptorPoolBinding; vk::RefCountedDescriptorPoolBinding descriptorPoolBinding;
std::unordered_map<BufferSerial, VkDescriptorSet> descriptorSetCache;
DriverUniformsDescriptorSet(); DriverUniformsDescriptorSet();
~DriverUniformsDescriptorSet(); ~DriverUniformsDescriptorSet();
...@@ -816,11 +817,9 @@ class ContextVk : public ContextImpl, public vk::Context ...@@ -816,11 +817,9 @@ class ContextVk : public ContextImpl, public vk::Context
vk::CommandBuffer *commandBuffer); vk::CommandBuffer *commandBuffer);
angle::Result allocateDriverUniforms(size_t driverUniformsSize, angle::Result allocateDriverUniforms(size_t driverUniformsSize,
DriverUniformsDescriptorSet *driverUniforms, DriverUniformsDescriptorSet *driverUniforms,
VkBuffer *bufferOut,
uint8_t **ptrOut, uint8_t **ptrOut,
bool *newBufferOut); bool *newBufferOut);
angle::Result updateDriverUniformsDescriptorSet(VkBuffer buffer, angle::Result updateDriverUniformsDescriptorSet(bool newBuffer,
bool newBuffer,
size_t driverUniformsSize, size_t driverUniformsSize,
DriverUniformsDescriptorSet *driverUniforms); DriverUniformsDescriptorSet *driverUniforms);
......
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