Fixes asserts related to buffer allocation using null rhi (#3367)

Fixes GPU crashes when releasing Indirect draw and query related dx12 objects
Fixes imgui profiler related to viewing buffer allocations

Signed-off-by: moudgils <moudgils@amazon.com>
monroegm-disable-blank-issue-2
moudgils 4 years ago committed by GitHub
parent aa68122002
commit b2b6886338
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -107,8 +107,7 @@ namespace AZ
if (m_deviceBufferNeedsUpdate) if (m_deviceBufferNeedsUpdate)
{ {
[[maybe_unused]] bool success = m_lightBufferHandler.UpdateBuffer(m_capsuleLightData.GetDataVector()); m_lightBufferHandler.UpdateBuffer(m_capsuleLightData.GetDataVector());
AZ_Error(FeatureProcessorName, success, "Unable to update buffer during Simulate().");
m_deviceBufferNeedsUpdate = false; m_deviceBufferNeedsUpdate = false;
} }
} }

@ -112,8 +112,7 @@ namespace AZ
if (m_deviceBufferNeedsUpdate) if (m_deviceBufferNeedsUpdate)
{ {
[[maybe_unused]] bool success = m_decalBufferHandler.UpdateBuffer(m_decalData.GetDataVector<0>()); m_decalBufferHandler.UpdateBuffer(m_decalData.GetDataVector<0>());
AZ_Error(FeatureProcessorName, success, "Unable to update buffer during Simulate().");
m_deviceBufferNeedsUpdate = false; m_deviceBufferNeedsUpdate = false;
} }
} }

@ -150,8 +150,7 @@ namespace AZ
if (m_deviceBufferNeedsUpdate) if (m_deviceBufferNeedsUpdate)
{ {
[[maybe_unused]] bool success = m_decalBufferHandler.UpdateBuffer(m_decalData.GetDataVector()); m_decalBufferHandler.UpdateBuffer(m_decalData.GetDataVector());
AZ_Error(FeatureProcessorName, success, "Unable to update buffer during Simulate().");
m_deviceBufferNeedsUpdate = false; m_deviceBufferNeedsUpdate = false;
} }
} }

@ -223,6 +223,9 @@ namespace AZ
/// Called when a buffer is being streamed asynchronously. /// Called when a buffer is being streamed asynchronously.
virtual ResultCode StreamBufferInternal(const BufferStreamRequest& request); virtual ResultCode StreamBufferInternal(const BufferStreamRequest& request);
//Called in order to do a simple mem copy allowing Null rhi to opt out
virtual void BufferCopy(void* destination, const void* source, size_t num);
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
BufferPoolDescriptor m_descriptor; BufferPoolDescriptor m_descriptor;

@ -143,7 +143,7 @@ namespace AZ
resultCode = MapBufferInternal(mapRequest, mapResponse); resultCode = MapBufferInternal(mapRequest, mapResponse);
if (resultCode == ResultCode::Success) if (resultCode == ResultCode::Success)
{ {
memcpy(mapResponse.m_data, initRequest.m_initialData, initRequest.m_descriptor.m_byteCount); BufferCopy(mapResponse.m_data, initRequest.m_initialData, initRequest.m_descriptor.m_byteCount);
UnmapBufferInternal(*initRequest.m_buffer); UnmapBufferInternal(*initRequest.m_buffer);
} }
} }
@ -219,6 +219,11 @@ namespace AZ
return m_descriptor; return m_descriptor;
} }
void BufferPool::BufferCopy(void* destination, const void* source, size_t num)
{
memcpy(destination, source, num);
}
ResultCode BufferPool::StreamBufferInternal([[maybe_unused]] const BufferStreamRequest& request) ResultCode BufferPool::StreamBufferInternal([[maybe_unused]] const BufferStreamRequest& request)
{ {
return ResultCode::Unimplemented; return ResultCode::Unimplemented;

@ -34,7 +34,7 @@ namespace AZ
if (!isDataValid) if (!isDataValid)
{ {
AZ_Warning("BufferPoolBase", false, "Failed to map buffer '%s'.", buffer.GetName().GetCStr()); AZ_Error("BufferPoolBase", false, "Failed to map buffer '%s'.", buffer.GetName().GetCStr());
} }
++buffer.m_mapRefCount; ++buffer.m_mapRefCount;
++m_mapRefCount; ++m_mapRefCount;

@ -111,6 +111,8 @@ namespace AZ
void IndirectBufferSignature::ShutdownInternal() void IndirectBufferSignature::ShutdownInternal()
{ {
auto& device = static_cast<Device&>(GetDevice());
device.QueueForRelease(m_signature);
m_signature = nullptr; m_signature = nullptr;
m_stride = 0; m_stride = 0;
} }

@ -237,5 +237,14 @@ namespace AZ
static constexpr D3D12_RANGE InvalidRange = {0,0}; static constexpr D3D12_RANGE InvalidRange = {0,0};
m_readBackBuffer->Unmap(0, &InvalidRange); m_readBackBuffer->Unmap(0, &InvalidRange);
} }
void QueryPool::ShutdownInternal()
{
auto& device = static_cast<Device&>(GetDevice());
device.QueueForRelease(m_queryHeap);
m_queryHeap = nullptr;
device.QueueForRelease(m_readBackBuffer);
m_readBackBuffer = nullptr;
}
} }
} }

@ -44,6 +44,7 @@ namespace AZ
RHI::ResultCode InitInternal(RHI::Device& device, const RHI::QueryPoolDescriptor& descriptor) override; RHI::ResultCode InitInternal(RHI::Device& device, const RHI::QueryPoolDescriptor& descriptor) override;
RHI::ResultCode InitQueryInternal(RHI::Query& query) override; RHI::ResultCode InitQueryInternal(RHI::Query& query) override;
RHI::ResultCode GetResultsInternal(uint32_t startIndex, uint32_t queryCount, uint64_t* results, uint32_t resultsCount, RHI::QueryResultFlagBits flags) override; RHI::ResultCode GetResultsInternal(uint32_t startIndex, uint32_t queryCount, uint64_t* results, uint32_t resultsCount, RHI::QueryResultFlagBits flags) override;
void ShutdownInternal() override;
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////

@ -39,9 +39,10 @@ namespace AZ
RHI::ResultCode InitBufferInternal([[maybe_unused]] RHI::Buffer& buffer, [[maybe_unused]] const RHI::BufferDescriptor& rhiDescriptor) override{ return RHI::ResultCode::Success;} RHI::ResultCode InitBufferInternal([[maybe_unused]] RHI::Buffer& buffer, [[maybe_unused]] const RHI::BufferDescriptor& rhiDescriptor) override{ return RHI::ResultCode::Success;}
void ShutdownResourceInternal([[maybe_unused]] RHI::Resource& resource) override {} void ShutdownResourceInternal([[maybe_unused]] RHI::Resource& resource) override {}
RHI::ResultCode OrphanBufferInternal([[maybe_unused]] RHI::Buffer& buffer) override { return RHI::ResultCode::Success;} RHI::ResultCode OrphanBufferInternal([[maybe_unused]] RHI::Buffer& buffer) override { return RHI::ResultCode::Success;}
RHI::ResultCode MapBufferInternal([[maybe_unused]] const RHI::BufferMapRequest& mapRequest, [[maybe_unused]] RHI::BufferMapResponse& response) override { return RHI::ResultCode::Unimplemented;} RHI::ResultCode MapBufferInternal([[maybe_unused]] const RHI::BufferMapRequest& mapRequest, [[maybe_unused]] RHI::BufferMapResponse& response) override { return RHI::ResultCode::Success;}
void UnmapBufferInternal([[maybe_unused]] RHI::Buffer& buffer) override {} void UnmapBufferInternal([[maybe_unused]] RHI::Buffer& buffer) override {}
RHI::ResultCode StreamBufferInternal([[maybe_unused]] const RHI::BufferStreamRequest& request) override { return RHI::ResultCode::Success;} RHI::ResultCode StreamBufferInternal([[maybe_unused]] const RHI::BufferStreamRequest& request) override { return RHI::ResultCode::Success;}
void BufferCopy([[maybe_unused]] void* destination, [[maybe_unused]] const void* source, [[maybe_unused]] size_t num) override {}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
}; };

@ -176,8 +176,7 @@ namespace AZ
return RHI::ResultCode::Success; return RHI::ResultCode::Success;
} }
// ResultCode::Unimplemented is used by Null Renderer and hence is a valid use case AZ_Error("Buffer", false, "Buffer::Init() failed to initialize RHI buffer. Error code: %d", static_cast<uint32_t>(resultCode));
AZ_Error("Buffer", resultCode == AZ::RHI::ResultCode::Unimplemented, "Buffer::Init() failed to initialize RHI buffer. Error code: %d", static_cast<uint32_t>(resultCode));
return resultCode; return resultCode;
} }
@ -241,11 +240,6 @@ namespace AZ
{ {
return response.m_data; return response.m_data;
} }
else if (result == RHI::ResultCode::Unimplemented)
{
// ResultCode::Unimplemented is used by Null Renderer and hence is a valid use case
return nullptr;
}
else else
{ {
AZ_Error("RPI::Buffer", false, "Failed to update RHI buffer. Error code: %d", result); AZ_Error("RPI::Buffer", false, "Failed to update RHI buffer. Error code: %d", result);

@ -136,6 +136,7 @@ namespace AZ
return false; return false;
} }
bufferPool->SetName(Name(AZStd::string::format("RPI::CommonBufferPool_%i", static_cast<uint32_t>(poolType))));
RHI::ResultCode resultCode = bufferPool->Init(*device, bufferPoolDesc); RHI::ResultCode resultCode = bufferPool->Init(*device, bufferPoolDesc);
if (resultCode != RHI::ResultCode::Success) if (resultCode != RHI::ResultCode::Success)
{ {

@ -1107,7 +1107,7 @@ namespace AZ
{ {
ImGui::TableSetupColumn("Parent pool"); ImGui::TableSetupColumn("Parent pool");
ImGui::TableSetupColumn("Name"); ImGui::TableSetupColumn("Name");
ImGui::TableSetupColumn("Size (MB)", 0, 100.0f); ImGui::TableSetupColumn("Size (MB)");
ImGui::TableSetupColumn("BindFlags", ImGuiTableColumnFlags_NoSort); ImGui::TableSetupColumn("BindFlags", ImGuiTableColumnFlags_NoSort);
ImGui::TableHeadersRow(); ImGui::TableHeadersRow();
ImGui::TableNextColumn(); ImGui::TableNextColumn();
@ -1133,7 +1133,7 @@ namespace AZ
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::Text(tableRow.m_bufImgName.GetCStr()); ImGui::Text(tableRow.m_bufImgName.GetCStr());
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::Text("%.2f", 1.0f * tableRow.m_sizeInBytes / GpuProfilerImGuiHelper::MB); ImGui::Text("%.4f", 1.0f * tableRow.m_sizeInBytes / GpuProfilerImGuiHelper::MB);
ImGui::TableNextColumn(); ImGui::TableNextColumn();
ImGui::Text(tableRow.m_bindFlags.c_str()); ImGui::Text(tableRow.m_bindFlags.c_str());
ImGui::TableNextColumn(); ImGui::TableNextColumn();
@ -1271,6 +1271,7 @@ namespace AZ
m_nameFilter.Draw("Search"); m_nameFilter.Draw("Search");
DrawTable(); DrawTable();
} }
ImGui::End();
} }
// --- ImGuiGpuProfiler --- // --- ImGuiGpuProfiler ---

Loading…
Cancel
Save