Rte fixes for stability (#6434)
* Fixed SRG updated related crash Signed-off-by: moudgils <47460854+moudgils@users.noreply.github.com> * Fixed SRG compile issue with metal which leads to multiple gpu crashes inlucde ImGuiPass render crash (#6315) Signed-off-by: Qing Tao <55564570+VickyAtAZ@users.noreply.github.com> Co-authored-by: Qing Tao <55564570+VickyAtAZ@users.noreply.github.com>
This commit is contained in:
@@ -204,23 +204,19 @@ namespace AZ
|
||||
{
|
||||
ShaderResourceGroup& group = static_cast<ShaderResourceGroup&>(groupBase);
|
||||
auto& device = static_cast<Device&>(GetDevice());
|
||||
group.m_compiledDataIndex = (group.m_compiledDataIndex + 1) % RHI::Limits::Device::FrameCountMax;
|
||||
|
||||
if (!groupData.IsAnyResourceTypeUpdated())
|
||||
{
|
||||
return RHI::ResultCode::Success;
|
||||
}
|
||||
|
||||
if (m_constantBufferSize &&
|
||||
groupData.IsResourceTypeEnabledForCompilation(static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::ConstantDataMask)))
|
||||
group.m_compiledDataIndex = (group.m_compiledDataIndex + 1) % RHI::Limits::Device::FrameCountMax;
|
||||
if (m_constantBufferSize)
|
||||
{
|
||||
memcpy(group.GetCompiledData().m_cpuConstantAddress, groupData.GetConstantData().data(), groupData.GetConstantData().size());
|
||||
}
|
||||
|
||||
if (m_viewsDescriptorTableSize &&
|
||||
groupData.IsResourceTypeEnabledForCompilation(
|
||||
static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::ImageViewMask) |
|
||||
static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::BufferViewMask)))
|
||||
if (m_viewsDescriptorTableSize)
|
||||
{
|
||||
//Lazy initialization for cbv/srv/uav Descriptor Tables
|
||||
if (!group.m_viewsDescriptorTable.IsValid())
|
||||
@@ -245,17 +241,12 @@ namespace AZ
|
||||
UpdateViewsDescriptorTable(descriptorTable, groupData);
|
||||
}
|
||||
|
||||
if (m_unboundedArrayCount &&
|
||||
groupData.IsResourceTypeEnabledForCompilation(
|
||||
static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::ImageViewUnboundedArrayMask) |
|
||||
static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::BufferViewUnboundedArrayMask)))
|
||||
if (m_unboundedArrayCount)
|
||||
{
|
||||
UpdateUnboundedArrayDescriptorTables(group, groupData);
|
||||
}
|
||||
|
||||
if (m_samplersDescriptorTableSize &&
|
||||
groupData.IsResourceTypeEnabledForCompilation(
|
||||
static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::SamplerMask)))
|
||||
if (m_samplersDescriptorTableSize)
|
||||
{
|
||||
const DescriptorTable descriptorTable(
|
||||
group.m_samplersDescriptorTable.GetOffset() + group.m_compiledDataIndex * m_samplersDescriptorTableSize,
|
||||
|
||||
@@ -61,10 +61,19 @@ namespace AZ
|
||||
|
||||
NSError* error = nil;
|
||||
id<MTLLibrary> lib = nil;
|
||||
|
||||
|
||||
bool loadFromByteCode = false;
|
||||
|
||||
// MacOS Big Sur (11.16.x) has issue loading some shader's byte code when GPUCapture(Metal) is on.
|
||||
// Only enable it for Monterey (12.x)
|
||||
if(@available(iOS 14.0, macOS 12.0, *))
|
||||
{
|
||||
loadFromByteCode = true;
|
||||
}
|
||||
|
||||
const uint8_t* shaderByteCode = reinterpret_cast<const uint8_t*>(shaderFunction->GetByteCode().data());
|
||||
const int byteCodeLength = shaderFunction->GetByteCode().size();
|
||||
if(byteCodeLength > 0 )
|
||||
if(byteCodeLength > 0 && loadFromByteCode)
|
||||
{
|
||||
dispatch_data_t dispatchByteCodeData = dispatch_data_create(shaderByteCode, byteCodeLength, NULL, DISPATCH_DATA_DESTRUCTOR_DEFAULT);
|
||||
lib = [mtlDevice newLibraryWithData:dispatchByteCodeData error:&error];
|
||||
@@ -74,7 +83,7 @@ namespace AZ
|
||||
//In case byte code was not generated try to create the lib with source code
|
||||
MTLCompileOptions* compileOptions = [MTLCompileOptions alloc];
|
||||
compileOptions.fastMathEnabled = YES;
|
||||
compileOptions.languageVersion = MTLLanguageVersion2_0;
|
||||
compileOptions.languageVersion = MTLLanguageVersion2_2;
|
||||
lib = [mtlDevice newLibraryWithSource:source
|
||||
options:compileOptions
|
||||
error:&error];
|
||||
|
||||
@@ -6,7 +6,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <AzCore/Debug/EventTrace.h>
|
||||
#include <RHI/ArgumentBuffer.h>
|
||||
#include <RHI/Conversions.h>
|
||||
#include <RHI/Device.h>
|
||||
@@ -62,57 +61,48 @@ namespace AZ
|
||||
RHI::ResultCode ShaderResourceGroupPool::CompileGroupInternal(RHI::ShaderResourceGroup& groupBase, const RHI::ShaderResourceGroupData& groupData)
|
||||
{
|
||||
ShaderResourceGroup& group = static_cast<ShaderResourceGroup&>(groupBase);
|
||||
group.UpdateCompiledDataIndex();
|
||||
|
||||
if (!groupData.IsAnyResourceTypeUpdated())
|
||||
{
|
||||
return RHI::ResultCode::Success;
|
||||
}
|
||||
|
||||
group.UpdateCompiledDataIndex();
|
||||
ArgumentBuffer& argBuffer = *group.m_compiledArgBuffers[group.m_compiledDataIndex];
|
||||
argBuffer.ClearResourceTracking();
|
||||
|
||||
auto constantData = groupData.GetConstantData();
|
||||
if (!constantData.empty() && groupData.IsResourceTypeEnabledForCompilation(static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::ConstantDataMask)))
|
||||
if (!constantData.empty())
|
||||
{
|
||||
argBuffer.UpdateConstantBufferViews(groupData.GetConstantData());
|
||||
}
|
||||
|
||||
const RHI::ShaderResourceGroupLayout* layout = groupData.GetLayout();
|
||||
uint32_t shaderInputIndex = 0;
|
||||
if (groupData.IsResourceTypeEnabledForCompilation(static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::ImageViewMask)))
|
||||
for (const RHI::ShaderInputImageDescriptor& shaderInputImage : layout->GetShaderInputListForImages())
|
||||
{
|
||||
for (const RHI::ShaderInputImageDescriptor& shaderInputImage : layout->GetShaderInputListForImages())
|
||||
{
|
||||
const RHI::ShaderInputImageIndex imageInputIndex(shaderInputIndex);
|
||||
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewArray(imageInputIndex);
|
||||
argBuffer.UpdateImageViews(shaderInputImage, imageInputIndex, imageViews);
|
||||
++shaderInputIndex;
|
||||
}
|
||||
const RHI::ShaderInputImageIndex imageInputIndex(shaderInputIndex);
|
||||
AZStd::array_view<RHI::ConstPtr<RHI::ImageView>> imageViews = groupData.GetImageViewArray(imageInputIndex);
|
||||
argBuffer.UpdateImageViews(shaderInputImage, imageInputIndex, imageViews);
|
||||
++shaderInputIndex;
|
||||
}
|
||||
|
||||
if (groupData.IsResourceTypeEnabledForCompilation(static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::SamplerMask)))
|
||||
shaderInputIndex = 0;
|
||||
for (const RHI::ShaderInputSamplerDescriptor& shaderInputSampler : layout->GetShaderInputListForSamplers())
|
||||
{
|
||||
shaderInputIndex = 0;
|
||||
for (const RHI::ShaderInputSamplerDescriptor& shaderInputSampler : layout->GetShaderInputListForSamplers())
|
||||
{
|
||||
const RHI::ShaderInputSamplerIndex samplerInputIndex(shaderInputIndex);
|
||||
AZStd::array_view<RHI::SamplerState> samplerStates = groupData.GetSamplerArray(samplerInputIndex);
|
||||
argBuffer.UpdateSamplers(shaderInputSampler, samplerInputIndex, samplerStates);
|
||||
++shaderInputIndex;
|
||||
}
|
||||
const RHI::ShaderInputSamplerIndex samplerInputIndex(shaderInputIndex);
|
||||
AZStd::array_view<RHI::SamplerState> samplerStates = groupData.GetSamplerArray(samplerInputIndex);
|
||||
argBuffer.UpdateSamplers(shaderInputSampler, samplerInputIndex, samplerStates);
|
||||
++shaderInputIndex;
|
||||
}
|
||||
|
||||
if (groupData.IsResourceTypeEnabledForCompilation(static_cast<uint32_t>(RHI::ShaderResourceGroupData::ResourceTypeMask::BufferViewMask)))
|
||||
shaderInputIndex = 0;
|
||||
for (const RHI::ShaderInputBufferDescriptor& shaderInputBuffer : layout->GetShaderInputListForBuffers())
|
||||
{
|
||||
shaderInputIndex = 0;
|
||||
for (const RHI::ShaderInputBufferDescriptor& shaderInputBuffer : layout->GetShaderInputListForBuffers())
|
||||
{
|
||||
const RHI::ShaderInputBufferIndex bufferInputIndex(shaderInputIndex);
|
||||
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewArray(bufferInputIndex);
|
||||
argBuffer.UpdateBufferViews(shaderInputBuffer, bufferInputIndex, bufferViews);
|
||||
++shaderInputIndex;
|
||||
}
|
||||
const RHI::ShaderInputBufferIndex bufferInputIndex(shaderInputIndex);
|
||||
AZStd::array_view<RHI::ConstPtr<RHI::BufferView>> bufferViews = groupData.GetBufferViewArray(bufferInputIndex);
|
||||
argBuffer.UpdateBufferViews(shaderInputBuffer, bufferInputIndex, bufferViews);
|
||||
++shaderInputIndex;
|
||||
}
|
||||
|
||||
return RHI::ResultCode::Success;
|
||||
|
||||
@@ -104,13 +104,13 @@ namespace AZ
|
||||
RHI::ResultCode ShaderResourceGroupPool::CompileGroupInternal(RHI::ShaderResourceGroup& groupBase, const RHI::ShaderResourceGroupData& groupData)
|
||||
{
|
||||
auto& group = static_cast<ShaderResourceGroup&>(groupBase);
|
||||
group.UpdateCompiledDataIndex(m_currentIteration);
|
||||
|
||||
if (!groupData.IsAnyResourceTypeUpdated())
|
||||
{
|
||||
return RHI::ResultCode::Success;
|
||||
}
|
||||
|
||||
group.UpdateCompiledDataIndex(m_currentIteration);
|
||||
DescriptorSet& descriptorSet = *group.m_compiledData[group.GetCompileDataIndex()];
|
||||
|
||||
const RHI::ShaderResourceGroupLayout* layout = groupData.GetLayout();
|
||||
|
||||
Reference in New Issue
Block a user