You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Gems/Atom/Feature/Common/Code/Source/DiffuseGlobalIllumination/DiffuseProbeGridTextureRead...

135 lines
6.4 KiB
C++

/*
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
* its licensors.
*
* For complete copyright and license terms please see the LICENSE at the root of this
* distribution (the "License"). All use of this software is governed by the License,
* or, if provided, by the license below or the license accompanying this file. Do not
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
*/
#include <DiffuseGlobalIllumination/DiffuseProbeGridTextureReadback.h>
#include <DiffuseGlobalIllumination/DiffuseProbeGrid.h>
namespace AZ
{
namespace Render
{
DiffuseProbeGridTextureReadback::DiffuseProbeGridTextureReadback(DiffuseProbeGrid* diffuseProbeGrid)
: m_diffuseProbeGrid(diffuseProbeGrid)
{
}
void DiffuseProbeGridTextureReadback::BeginTextureReadback(DiffuseProbeGridBakeTexturesCallback callback)
{
AZ_Assert(m_readbackState == DiffuseProbeGridReadbackState::Idle, "DiffuseProbeGridTextureReadback is already processing a readback request");
m_callback = callback;
m_readbackState = DiffuseProbeGridReadbackState::Irradiance;
}
void DiffuseProbeGridTextureReadback::Update(const AZ::Name& passName)
{
if (m_readbackState == DiffuseProbeGridReadbackState::Idle || m_readbackState == DiffuseProbeGridReadbackState::Complete)
{
return;
}
if (m_attachmentReadback.get() && m_attachmentReadback->GetReadbackState() > RPI::AttachmentReadback::ReadbackState::Idle)
{
// still processing previous request
return;
}
AZStd::string readbackName = AZStd::string::format("DiffuseProbeGridReadback_%s", passName.GetCStr());
RHI::ImageDescriptor descriptor;
RHI::AttachmentId attachmentId;
RPI::AttachmentReadback::CallbackFunction callbackFunction;
switch (m_readbackState)
{
case DiffuseProbeGridReadbackState::Irradiance:
descriptor = m_diffuseProbeGrid->GetIrradianceImage()->GetDescriptor();
attachmentId = m_diffuseProbeGrid->GetIrradianceImageAttachmentId();
callbackFunction = [this](const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult)
{
m_irradianceReadbackResult = readbackResult;
m_readbackState = DiffuseProbeGridReadbackState::Distance;
};
break;
case DiffuseProbeGridReadbackState::Distance:
descriptor = m_diffuseProbeGrid->GetDistanceImage()->GetDescriptor();
attachmentId = m_diffuseProbeGrid->GetDistanceImageAttachmentId();
callbackFunction = [this](const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult)
{
m_distanceReadbackResult = readbackResult;
m_readbackState = DiffuseProbeGridReadbackState::Relocation;
};
break;
case DiffuseProbeGridReadbackState::Relocation:
descriptor = m_diffuseProbeGrid->GetRelocationImage()->GetDescriptor();
attachmentId = m_diffuseProbeGrid->GetRelocationImageAttachmentId();
callbackFunction = [this](const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult)
{
m_relocationReadbackResult = readbackResult;
m_readbackState = DiffuseProbeGridReadbackState::Classification;
};
break;
case DiffuseProbeGridReadbackState::Classification:
descriptor = m_diffuseProbeGrid->GetClassificationImage()->GetDescriptor();
attachmentId = m_diffuseProbeGrid->GetClassificationImageAttachmentId();
callbackFunction = [this](const AZ::RPI::AttachmentReadback::ReadbackResult& readbackResult)
{
m_classificationReadbackResult = readbackResult;
m_readbackState = DiffuseProbeGridReadbackState::Complete;
};
break;
default:
AZ_Assert(false, "Unknown readback state");
}
m_attachmentReadback = AZStd::make_shared<AZ::RPI::AttachmentReadback>(AZ::RHI::ScopeId{ "DiffuseProbeGridTextureReadBack" });
m_attachmentReadback->SetCallback(callbackFunction);
AZ::RPI::PassAttachment passAttachment;
passAttachment.m_descriptor = descriptor;
passAttachment.m_path = attachmentId;
passAttachment.m_name = readbackName;
passAttachment.m_lifetime = RHI::AttachmentLifetimeType::Imported;
m_attachmentReadback->ReadPassAttachment(&passAttachment, AZ::Name(readbackName));
}
void DiffuseProbeGridTextureReadback::FrameBegin(AZ::RPI::Pass::FramePrepareParams& params)
{
if (m_readbackState == DiffuseProbeGridReadbackState::Idle)
{
return;
}
if (!m_attachmentReadback.get())
{
return;
}
if (m_readbackState == DiffuseProbeGridReadbackState::Complete)
{
// readback of all textures is complete, invoke callback and return to Idle state
m_callback(
{ m_irradianceReadbackResult.m_dataBuffer, m_irradianceReadbackResult.m_imageDescriptor.m_format, m_irradianceReadbackResult.m_imageDescriptor.m_size },
{ m_distanceReadbackResult.m_dataBuffer, m_distanceReadbackResult.m_imageDescriptor.m_format, m_distanceReadbackResult.m_imageDescriptor.m_size },
{ m_relocationReadbackResult.m_dataBuffer, m_relocationReadbackResult.m_imageDescriptor.m_format, m_relocationReadbackResult.m_imageDescriptor.m_size },
{ m_classificationReadbackResult.m_dataBuffer, m_classificationReadbackResult.m_imageDescriptor.m_format, m_classificationReadbackResult.m_imageDescriptor.m_size });
m_readbackState = DiffuseProbeGridReadbackState::Idle;
m_attachmentReadback.reset();
return;
}
m_attachmentReadback->FrameBegin(params);
}
} // namespace Render
} // namespace AZ