ATOM-15658 Better option of CreateCommonBuffer requires unique buffer name (#1133)

* ATOM-15658 Better option of CreateCommonBuffer requires unique buffer name
- Change the CreateCommonBuffer function to not require an unique  name by default.
- Remove the code for generating unique buffer names.
- Add buffer name to BufferAsset so it can be used for device object name instead of using asset file name.
- Change RPI::Buffer to use BufferName_AssetUuid as attachment id.
This commit is contained in:
Qing Tao
2021-06-04 10:28:56 -07:00
committed by GitHub
parent 5d4226df16
commit dcdd63966e
25 changed files with 104 additions and 77 deletions
@@ -114,7 +114,7 @@ namespace AZ
if (auto* serialize = azrtti_cast<SerializeContext*>(context))
{
serialize->Class<ModelAssetBuilderComponent, SceneAPI::SceneCore::ExportingComponent>()
->Version(26); // [ATOM-14992]
->Version(27); // [ATOM-15658]
}
}
@@ -32,10 +32,6 @@ namespace AZ
auto buffer = Data::InstanceDatabase<Buffer>::Instance().FindOrCreate(
Data::InstanceId::CreateFromAssetId(bufferAsset.GetId()),
bufferAsset);
if (buffer && buffer->m_rhiBuffer)
{
buffer->m_rhiBuffer->SetName(Name(bufferAsset.GetHint()));
}
return buffer;
}
@@ -170,6 +166,16 @@ namespace AZ
return resultCode;
}
}
m_rhiBuffer->SetName(Name(bufferAsset.GetName()));
// Only generate buffer's attachment id if the buffer is writable
if (RHI::CheckBitsAny(m_rhiBuffer->GetDescriptor().m_bindFlags,
RHI::BufferBindFlags::ShaderWrite | RHI::BufferBindFlags::CopyWrite | RHI::BufferBindFlags::DynamicInputAssembly))
{
// attachment id = bufferName_bufferInstanceId
m_attachmentId = Name(bufferAsset.GetName() + "_" + bufferAsset.GetId().m_guid.ToString<AZStd::string>(false, false));
}
return RHI::ResultCode::Success;
}
@@ -312,7 +318,8 @@ namespace AZ
const RHI::AttachmentId& Buffer::GetAttachmentId() const
{
return m_rhiBuffer->GetName();
AZ_Assert(!m_attachmentId.GetStringView().empty(), "Read-only buffer doesn't need attachment id");
return m_attachmentId;
}
const RHI::BufferViewDescriptor& Buffer::GetBufferViewDescriptor() const
@@ -152,15 +152,22 @@ namespace AZ
}
Data::Instance<Buffer> BufferSystem::CreateBufferFromCommonPool(const CommonBufferDescriptor& descriptor)
{
Uuid bufferId = Uuid::CreateName(descriptor.m_bufferName.c_str());
// Report error if there is a buffer with same name.
// Note: this shouldn't return the existing buffer because users are expecting a newly created buffer.
if (Data::InstanceDatabase<Buffer>::Instance().Find(Data::InstanceId(bufferId)))
{
Uuid bufferId;
if (descriptor.m_isUniqueName)
{
AZ_Error("BufferSystem", false, "Buffer with same name '%s' already exist", descriptor.m_bufferName.c_str());
return nullptr;
bufferId = Uuid::CreateName(descriptor.m_bufferName.c_str());
// Report error if there is a buffer with same name.
// Note: this shouldn't return the existing buffer because users are expecting a newly created buffer.
if (Data::InstanceDatabase<Buffer>::Instance().Find(Data::InstanceId(bufferId)))
{
AZ_Error("BufferSystem", false, "Buffer with same name '%s' already exist", descriptor.m_bufferName.c_str());
return nullptr;
}
}
else
{
bufferId = Uuid::CreateRandom();
}
RHI::Ptr<RHI::BufferPool> bufferPool = GetCommonBufferPool(descriptor.m_poolType);
@@ -207,9 +214,9 @@ namespace AZ
return nullptr;
}
Data::Instance<Buffer> BufferSystem::FindCommonBuffer(AZStd::string_view bufferName)
Data::Instance<Buffer> BufferSystem::FindCommonBuffer(AZStd::string_view uniqueBufferName)
{
Uuid bufferId = Uuid::CreateName(bufferName.data());
Uuid bufferId = Uuid::CreateName(uniqueBufferName.data());
return Data::InstanceDatabase<Buffer>::Instance().Find(Data::InstanceId(bufferId));
}
} // namespace RPI
@@ -30,7 +30,7 @@ namespace AZ
// Create the ring buffer from common pool
RPI::CommonBufferDescriptor desc;
desc.m_poolType = RPI::CommonBufferPoolType::DynamicInputAssembly;
desc.m_bufferName = AZStd::string::format("DyanmicBufferRing_%p", this);
desc.m_bufferName = "DyanmicBufferRing";
desc.m_elementSize = 1;
desc.m_byteCount = ringBufferSize;
m_ringBuffer = RPI::BufferSystemInterface::Get()->CreateBufferFromCommonPool(desc);
@@ -30,7 +30,8 @@ namespace AZ
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
{
serializeContext->Class<BufferAsset>()
->Version(1)
->Version(2)
->Field("Name", &BufferAsset::m_name)
->Field("Buffer", &BufferAsset::m_buffer)
->Field("BufferDescriptor", &BufferAsset::m_bufferDescriptor)
->Field("BufferViewDescriptor", &BufferAsset::m_bufferViewDescriptor)
@@ -80,5 +81,10 @@ namespace AZ
{
return m_poolType;
}
const AZStd::string& BufferAsset::GetName() const
{
return m_name;
}
} //namespace RPI
} // namespace AZ
@@ -152,7 +152,10 @@ namespace AZ
void BufferAssetCreator::SetBufferName(AZStd::string_view name)
{
m_asset.SetHint(name);
if (ValidateIsReady())
{
m_asset->m_name = name;
}
}
bool BufferAssetCreator::Clone(const Data::Asset<BufferAsset>& sourceAsset, Data::Asset<BufferAsset>& clonedResult, Data::AssetId& inOutLastCreatedAssetId)