From ed4c6fc1e892eaaa44b261ab0be10c1734e40747 Mon Sep 17 00:00:00 2001 From: Oleksii Date: Mon, 11 Mar 2019 13:24:30 +0200 Subject: [PATCH 1/6] Add warning when shader macro not found Shader gen material macros is ignored if m_pShaderCommonGlobalFlag has 64 values and new values is skipped. Issue reproduces when you create new shaders and introduce new ShaderGen flags. --- dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp b/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp index a1199db0fc..74466aa9b3 100644 --- a/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp +++ b/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp @@ -737,6 +737,7 @@ uint64 CShaderMan::mfGetShaderGlobalMaskGenFromString(const char* szShaderGen) { nMaskGen |= pIter->second; } + AZ_Warning("Shaders", pIter != pEnd, "Failed to find property \"%s\". Shader macro is ignored.", pCurrFlag); } return nMaskGen; From 934d5b12ae15bfe9a02b21db9d496da1be954c75 Mon Sep 17 00:00:00 2001 From: Oleksii Leleka Date: Mon, 11 Mar 2019 14:30:18 +0200 Subject: [PATCH 2/6] Revert to LY 1.17 This reverts commit ed4c6fc1e892eaaa44b261ab0be10c1734e40747. --- dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp b/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp index 74466aa9b3..a1199db0fc 100644 --- a/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp +++ b/dev/Code/CryEngine/RenderDll/Common/Shaders/ShaderParse.cpp @@ -737,7 +737,6 @@ uint64 CShaderMan::mfGetShaderGlobalMaskGenFromString(const char* szShaderGen) { nMaskGen |= pIter->second; } - AZ_Warning("Shaders", pIter != pEnd, "Failed to find property \"%s\". Shader macro is ignored.", pCurrFlag); } return nMaskGen; From cc4382280b645ec91328e64afc9e76168b28b3ff Mon Sep 17 00:00:00 2001 From: Smbat Makiyan Date: Wed, 15 Jan 2020 13:03:28 +0200 Subject: [PATCH 3/6] AudioEngine Gem memroy allocation fixes --- .../Code/Source/Engine/AudioInput/AudioInputFile.cpp | 4 ++-- .../Code/Source/Engine/AudioInput/AudioInputStream.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp index 2de197aa81..b9198860e8 100644 --- a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp +++ b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp @@ -87,7 +87,7 @@ namespace Audio if (IsOk()) { // Allocate a new buffer to hold the data... - m_dataPtr = new AZ::u8[m_dataSize]; + m_dataPtr = static_cast(azmalloc(m_dataSize)); // Read file into internal buffer... size_t bytesRead = fileStream.Read(m_dataSize, m_dataPtr); @@ -110,7 +110,7 @@ namespace Audio { if (m_dataPtr) { - delete [] m_dataPtr; + azfree(m_dataPtr); m_dataPtr = nullptr; } m_dataSize = 0; diff --git a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp index 98618716c1..6259b5b952 100644 --- a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp +++ b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp @@ -34,11 +34,11 @@ namespace Audio if (m_config.m_sampleType == AudioInputSampleType::Float && m_config.m_bitsPerSample == 32) { - m_buffer.reset(new RingBuffer(numSamples)); + m_buffer.reset(aznew RingBuffer(numSamples)); } else if (m_config.m_sampleType == AudioInputSampleType::Int && m_config.m_bitsPerSample == 16) { - m_buffer.reset(new RingBuffer(numSamples)); + m_buffer.reset(aznew RingBuffer(numSamples)); } else { From 3e2d3c3e524c0e5d6e6a5555259950d329453356 Mon Sep 17 00:00:00 2001 From: Smbat Makiyan Date: Wed, 15 Jan 2020 13:13:30 +0200 Subject: [PATCH 4/6] Revert "AudioEngine Gem memroy allocation fixes" This reverts commit cc4382280b645ec91328e64afc9e76168b28b3ff. --- .../Code/Source/Engine/AudioInput/AudioInputFile.cpp | 4 ++-- .../Code/Source/Engine/AudioInput/AudioInputStream.cpp | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp index b9198860e8..2de197aa81 100644 --- a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp +++ b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputFile.cpp @@ -87,7 +87,7 @@ namespace Audio if (IsOk()) { // Allocate a new buffer to hold the data... - m_dataPtr = static_cast(azmalloc(m_dataSize)); + m_dataPtr = new AZ::u8[m_dataSize]; // Read file into internal buffer... size_t bytesRead = fileStream.Read(m_dataSize, m_dataPtr); @@ -110,7 +110,7 @@ namespace Audio { if (m_dataPtr) { - azfree(m_dataPtr); + delete [] m_dataPtr; m_dataPtr = nullptr; } m_dataSize = 0; diff --git a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp index 6259b5b952..98618716c1 100644 --- a/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp +++ b/dev/Gems/AudioEngineWwise/Code/Source/Engine/AudioInput/AudioInputStream.cpp @@ -34,11 +34,11 @@ namespace Audio if (m_config.m_sampleType == AudioInputSampleType::Float && m_config.m_bitsPerSample == 32) { - m_buffer.reset(aznew RingBuffer(numSamples)); + m_buffer.reset(new RingBuffer(numSamples)); } else if (m_config.m_sampleType == AudioInputSampleType::Int && m_config.m_bitsPerSample == 16) { - m_buffer.reset(aznew RingBuffer(numSamples)); + m_buffer.reset(new RingBuffer(numSamples)); } else { From 9dee8aecf91c1ff54569b434707ca0b363368d2a Mon Sep 17 00:00:00 2001 From: "FRAGLAB\\Andrey.Mas" Date: Thu, 5 Mar 2020 16:55:01 +0200 Subject: [PATCH 5/6] Engine crash on level unload --- dev/Code/CryEngine/Cry3DEngine/ParticleList.h | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/dev/Code/CryEngine/Cry3DEngine/ParticleList.h b/dev/Code/CryEngine/Cry3DEngine/ParticleList.h index b95093396d..8a2222818d 100644 --- a/dev/Code/CryEngine/Cry3DEngine/ParticleList.h +++ b/dev/Code/CryEngine/Cry3DEngine/ParticleList.h @@ -213,11 +213,9 @@ class ParticleList void clear() { // Destroy all elements, in reverse order - for (Node* p = m_pTail; p != NULL; ) + while (m_pTail) { - Node* pPrev = p->pPrev; - destroy(p); - p = pPrev; + erase(m_pTail); } reset(); } From b8850d8ead803635ac3dd76dcb034cc9b4d68f0e Mon Sep 17 00:00:00 2001 From: mik403 Date: Mon, 11 Jan 2021 11:12:08 +0200 Subject: [PATCH 6/6] emotionfx memory fixes --- .../RCExt/Motion/MotionDataBuilder.cpp | 2 +- .../EMotionFX/Source/Importer/Importer.cpp | 1 + .../EMotionFX/Source/MotionInstancePool.cpp | 2 +- .../Source/Integration/Assets/ActorAsset.cpp | 1 + .../Integration/Assets/AnimGraphAsset.cpp | 1 + .../Source/Integration/Assets/AssetCommon.h | 6 +++ .../Source/Integration/Assets/MotionAsset.cpp | 1 + .../Integration/Assets/MotionSetAsset.cpp | 1 + .../Rendering/Cry/CryRenderActor.cpp | 47 +++++++++++++++++++ 9 files changed, 60 insertions(+), 2 deletions(-) diff --git a/dev/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp b/dev/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp index a3ff0cd2c4..14afd0e94b 100644 --- a/dev/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp +++ b/dev/Gems/EMotionFX/Code/EMotionFX/Pipeline/RCExt/Motion/MotionDataBuilder.cpp @@ -41,7 +41,7 @@ namespace { - const float kDefaultMaxTranslationError = 0.000025f; + const float kDefaultMaxTranslationError = 0.00025f; const float kDefaultMaxRotationError = 0.000025f; const float kDefaultMaxScaleError = 0.0001f; } diff --git a/dev/Gems/EMotionFX/Code/EMotionFX/Source/Importer/Importer.cpp b/dev/Gems/EMotionFX/Code/EMotionFX/Source/Importer/Importer.cpp index 9599e9b933..79c7dde094 100644 --- a/dev/Gems/EMotionFX/Code/EMotionFX/Source/Importer/Importer.cpp +++ b/dev/Gems/EMotionFX/Code/EMotionFX/Source/Importer/Importer.cpp @@ -634,6 +634,7 @@ namespace EMotionFX // get rid of shared data ResetSharedData(sharedData); sharedData.Clear(); + sharedData.Shrink(); return motion; } diff --git a/dev/Gems/EMotionFX/Code/EMotionFX/Source/MotionInstancePool.cpp b/dev/Gems/EMotionFX/Code/EMotionFX/Source/MotionInstancePool.cpp index cccc4aabda..66b1be0251 100644 --- a/dev/Gems/EMotionFX/Code/EMotionFX/Source/MotionInstancePool.cpp +++ b/dev/Gems/EMotionFX/Code/EMotionFX/Source/MotionInstancePool.cpp @@ -220,7 +220,7 @@ namespace EMotionFX //mPool->mFreeList.Reserve( numInstances * 2 ); if (mPool->mFreeList.GetMaxLength() < mPool->mNumInstances) { - mPool->mFreeList.Reserve(mPool->mNumInstances); + mPool->mFreeList.Reserve(mPool->mNumInstances + mPool->mFreeList.GetMaxLength() / 2); } mPool->mFreeList.ResizeFast(startIndex + numInstances); diff --git a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp index 96638d636a..7f7d390b0c 100644 --- a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp +++ b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/ActorAsset.cpp @@ -69,6 +69,7 @@ namespace EMotionFX RenderBackend* renderBackend = AZ::Interface::Get()->GetRenderBackend(); assetData->m_renderActor.reset(renderBackend->CreateActor(assetData)); + assetData->ReleaseEmotionFXData(); return static_cast(assetData->m_emfxActor); } diff --git a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp index 2a8ad69db0..5d144943e0 100644 --- a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp +++ b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AnimGraphAsset.cpp @@ -90,6 +90,7 @@ namespace EMotionFX } } + assetData->ReleaseEmotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxAnimGraph, "Failed to initialize anim graph asset %s", asset.GetHint().c_str()); return static_cast(assetData->m_emfxAnimGraph); } diff --git a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h index 865b802f34..c9a57c69c2 100644 --- a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h +++ b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/AssetCommon.h @@ -32,6 +32,12 @@ namespace EMotionFX AZ_RTTI(EMotionFXAsset, "{043F606A-A483-4910-8110-D8BC4B78922C}", AZ::Data::AssetData) AZ_CLASS_ALLOCATOR(EMotionFXAsset, EMotionFXAllocator, 0) + void ReleaseEmotionFXData() + { + m_emfxNativeData.clear(); + m_emfxNativeData.shrink_to_fit(); + } + AZStd::vector m_emfxNativeData; }; diff --git a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp index ecdeb835a5..95b0e28802 100644 --- a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp +++ b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionAsset.cpp @@ -48,6 +48,7 @@ namespace EMotionFX assetData->m_emfxMotion->SetIsOwnedByRuntime(true); } + assetData->ReleaseEmotionFXData(); AZ_Error("EMotionFX", assetData->m_emfxMotion, "Failed to initialize motion asset %s", asset.GetHint().c_str()); return (assetData->m_emfxMotion); } diff --git a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp index 1c9d41f102..c523b99ce5 100644 --- a/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp +++ b/dev/Gems/EMotionFX/Code/Source/Integration/Assets/MotionSetAsset.cpp @@ -234,6 +234,7 @@ namespace EMotionFX // Set motion set's motion load callback, so if EMotion FX queries back for a motion, // we can pull the one managed through an AZ::Asset. assetData->m_emfxMotionSet->SetCallback(aznew CustomMotionSetCallback(asset)); + assetData->ReleaseEmotionFXData(); return true; } diff --git a/dev/Gems/EMotionFX/Code/Source/Integration/Rendering/Cry/CryRenderActor.cpp b/dev/Gems/EMotionFX/Code/Source/Integration/Rendering/Cry/CryRenderActor.cpp index f76715f562..155d468c85 100644 --- a/dev/Gems/EMotionFX/Code/Source/Integration/Rendering/Cry/CryRenderActor.cpp +++ b/dev/Gems/EMotionFX/Code/Source/Integration/Rendering/Cry/CryRenderActor.cpp @@ -475,6 +475,53 @@ namespace EMotionFX // It's now safe to use this LOD. lod.m_isReady = true; } + + //Cry rendering does skinning on the GPU, the goal is to remove all GPU deformed meshes and unused morph targets. + //We have to do it after the vertex buffers get created for the GPU, for CryRenderActor that is after the Finalize() + const uint32 numNodes = actor->GetNumNodes(); + EMotionFX::Skeleton* skeleton = actor->GetSkeleton(); + if (skeleton == nullptr) + { + AZ_Error("EMotionFX", false, "Skeleton couln't be null here! Will return"); + return; + } + + // iterate through all geometry LOD levels + for (uint32 lodLevel = 0; lodLevel < numLODs; ++lodLevel) + { + // iterate through all nodes + for (uint32 n = 0; n < numNodes; ++n) + { + // get the current node + EMotionFX::Node* node = skeleton->GetNode(n); + if (node == nullptr) + { + continue; + } + + // get the mesh for the node, if there is any + EMotionFX::Mesh* mesh = actor->GetMesh(lodLevel, n); + if (mesh == nullptr) + { + continue; + } + + // skip collision meshes + if (mesh->GetIsCollisionMesh()) + { + continue; + } + + // classify the mesh type + EMotionFX::Mesh::EMeshType meshType = mesh->ClassifyMeshType(lodLevel, actor, node->GetNodeIndex(), false, 4, 200); + + // remove the meshes + if (meshType != EMotionFX::Mesh::MESHTYPE_CPU_DEFORMED) + { + actor->RemoveNodeMeshForLOD(lodLevel, n); + } // if mesh is cpu deformed + } + } } } // namespace Integration } // namespace EMotionFX