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:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user