Skip to content

Commit 97008da

Browse files
Fixes to parallel cache access and to GetTlas*Buffer (o3de#17546)
Signed-off-by: Martin Winter <[email protected]>
1 parent ee2e7a9 commit 97008da

File tree

6 files changed

+34
-16
lines changed

6 files changed

+34
-16
lines changed

Gems/Atom/RHI/Code/Include/Atom/RHI/MultiDeviceBuffer.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ namespace AZ::RHI
104104
}
105105

106106
private:
107+
//! Safe-guard access to BufferView cache during parallel access
108+
mutable AZStd::mutex m_bufferViewMutex;
107109
//! A raw pointer to a multi-device buffer
108110
ConstPtr<RHI::MultiDeviceBuffer> m_buffer;
109111
//! The corresponding BufferViewDescriptor for this view.

Gems/Atom/RHI/Code/Include/Atom/RHI/MultiDeviceImage.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,8 @@ namespace AZ::RHI
150150
}
151151

152152
private:
153+
//! Safe-guard access to ImageView cache during parallel access
154+
mutable AZStd::mutex m_imageViewMutex;
153155
//! A raw pointer to a multi-device image
154156
ConstPtr<RHI::MultiDeviceImage> m_image;
155157
//! The corresponding ImageViewDescriptor for this view.

Gems/Atom/RHI/Code/Include/Atom/RHI/MultiDeviceRayTracingAccelerationStructure.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,5 +227,7 @@ namespace AZ::RHI
227227

228228
private:
229229
MultiDeviceRayTracingTlasDescriptor m_mdDescriptor;
230+
mutable RHI::Ptr<RHI::MultiDeviceBuffer> m_tlasBuffer;
231+
mutable RHI::Ptr<RHI::MultiDeviceBuffer> m_tlasInstancesBuffer;
230232
};
231233
} // namespace AZ::RHI

Gems/Atom/RHI/Code/Source/RHI/MultiDeviceBuffer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ namespace AZ::RHI
6666
//! Given a device index, return the corresponding BufferView for the selected device
6767
const RHI::Ptr<RHI::BufferView> MultiDeviceBufferView::GetDeviceBufferView(int deviceIndex) const
6868
{
69+
AZStd::lock_guard lock(m_bufferViewMutex);
6970
auto iterator{ m_cache.find(deviceIndex) };
7071
if (iterator == m_cache.end())
7172
{

Gems/Atom/RHI/Code/Source/RHI/MultiDeviceImage.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ namespace AZ::RHI
105105
//! Given a device index, return the corresponding BufferView for the selected device
106106
const RHI::Ptr<RHI::ImageView> MultiDeviceImageView::GetDeviceImageView(int deviceIndex) const
107107
{
108+
AZStd::lock_guard lock(m_imageViewMutex);
108109
auto iterator{ m_cache.find(deviceIndex) };
109110
if (iterator == m_cache.end())
110111
{

Gems/Atom/RHI/Code/Source/RHI/MultiDeviceRayTracingAccelerationStructure.cpp

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -267,25 +267,30 @@ namespace AZ::RHI
267267
return nullptr;
268268
}
269269

270-
auto tlasBuffer = aznew RHI::MultiDeviceBuffer;
271-
tlasBuffer->Init(GetDeviceMask());
270+
if (m_tlasBuffer)
271+
{
272+
return m_tlasBuffer;
273+
}
274+
275+
m_tlasBuffer = aznew RHI::MultiDeviceBuffer;
276+
m_tlasBuffer->Init(GetDeviceMask());
272277

273278
IterateObjects<RayTracingTlas>(
274-
[&tlasBuffer](int deviceIndex, auto deviceRayTracingTlas)
279+
[this](int deviceIndex, auto deviceRayTracingTlas)
275280
{
276-
tlasBuffer->m_deviceObjects[deviceIndex] = deviceRayTracingTlas->GetTlasBuffer();
281+
m_tlasBuffer->m_deviceObjects[deviceIndex] = deviceRayTracingTlas->GetTlasBuffer();
277282

278-
if (!tlasBuffer->m_deviceObjects[deviceIndex])
283+
if (!m_tlasBuffer->m_deviceObjects[deviceIndex])
279284
{
280-
tlasBuffer = nullptr;
285+
m_tlasBuffer = nullptr;
281286
return ResultCode::Fail;
282287
}
283288

284-
tlasBuffer->SetDescriptor(tlasBuffer->GetDeviceBuffer(deviceIndex)->GetDescriptor());
289+
m_tlasBuffer->SetDescriptor(m_tlasBuffer->GetDeviceBuffer(deviceIndex)->GetDescriptor());
285290
return ResultCode::Success;
286291
});
287292

288-
return tlasBuffer;
293+
return m_tlasBuffer;
289294
}
290295

291296
const RHI::Ptr<RHI::MultiDeviceBuffer> MultiDeviceRayTracingTlas::GetTlasInstancesBuffer() const
@@ -295,23 +300,28 @@ namespace AZ::RHI
295300
return nullptr;
296301
}
297302

298-
auto tlasInstancesBuffer = aznew RHI::MultiDeviceBuffer;
299-
tlasInstancesBuffer->Init(GetDeviceMask());
303+
if (m_tlasInstancesBuffer)
304+
{
305+
return m_tlasInstancesBuffer;
306+
}
307+
308+
m_tlasInstancesBuffer = aznew RHI::MultiDeviceBuffer;
309+
m_tlasInstancesBuffer->Init(GetDeviceMask());
300310

301311
IterateObjects<RayTracingTlas>(
302-
[&tlasInstancesBuffer](int deviceIndex, auto deviceRayTracingTlas)
312+
[this](int deviceIndex, auto deviceRayTracingTlas)
303313
{
304-
tlasInstancesBuffer->m_deviceObjects[deviceIndex] = deviceRayTracingTlas->GetTlasBuffer();
314+
m_tlasInstancesBuffer->m_deviceObjects[deviceIndex] = deviceRayTracingTlas->GetTlasBuffer();
305315

306-
if (!tlasInstancesBuffer->m_deviceObjects[deviceIndex])
316+
if (!m_tlasInstancesBuffer->m_deviceObjects[deviceIndex])
307317
{
308-
tlasInstancesBuffer = nullptr;
318+
m_tlasInstancesBuffer = nullptr;
309319
return false;
310320
}
311321

312-
tlasInstancesBuffer->SetDescriptor(tlasInstancesBuffer->GetDeviceBuffer(deviceIndex)->GetDescriptor());
322+
m_tlasInstancesBuffer->SetDescriptor(m_tlasInstancesBuffer->GetDeviceBuffer(deviceIndex)->GetDescriptor());
313323
return true;
314324
});
315-
return tlasInstancesBuffer;
325+
return m_tlasInstancesBuffer;
316326
}
317327
} // namespace AZ::RHI

0 commit comments

Comments
 (0)