Merge remote-tracking branch 'origin/master' into 1.9
# Conflicts: # Source/Engine/Renderer/RenderList.cpp # Source/Engine/Renderer/RenderList.h
This commit is contained in:
@@ -10,6 +10,7 @@
|
||||
#include "GPUTimerQueryVulkan.h"
|
||||
#endif
|
||||
#include "DescriptorSetVulkan.h"
|
||||
#include "Engine/Engine/Engine.h"
|
||||
#include "Engine/Profiler/ProfilerCPU.h"
|
||||
|
||||
void CmdBufferVulkan::AddWaitSemaphore(VkPipelineStageFlags waitFlags, SemaphoreVulkan* waitSemaphore)
|
||||
@@ -32,7 +33,7 @@ void CmdBufferVulkan::Begin()
|
||||
// Acquire a descriptor pool set on
|
||||
if (_descriptorPoolSetContainer == nullptr)
|
||||
{
|
||||
_descriptorPoolSetContainer = &_device->DescriptorPoolsManager->AcquirePoolSetContainer();
|
||||
_descriptorPoolSetContainer = _device->DescriptorPoolsManager->AcquirePoolSetContainer();
|
||||
}
|
||||
|
||||
_state = State::IsInsideBegin;
|
||||
@@ -138,7 +139,7 @@ void CmdBufferVulkan::RefreshFenceStatus()
|
||||
|
||||
if (_descriptorPoolSetContainer)
|
||||
{
|
||||
_device->DescriptorPoolsManager->ReleasePoolSet(*_descriptorPoolSetContainer);
|
||||
_descriptorPoolSetContainer->LastFrameUsed = Engine::FrameCount;
|
||||
_descriptorPoolSetContainer = nullptr;
|
||||
}
|
||||
}
|
||||
@@ -279,6 +280,7 @@ void CmdBufferManagerVulkan::WaitForCmdBuffer(CmdBufferVulkan* cmdBuffer, float
|
||||
void CmdBufferManagerVulkan::PrepareForNewActiveCommandBuffer()
|
||||
{
|
||||
PROFILE_CPU();
|
||||
ASSERT_LOW_LAYER(_activeCmdBuffer == nullptr)
|
||||
for (int32 i = 0; i < _pool._cmdBuffers.Count(); i++)
|
||||
{
|
||||
auto cmdBuffer = _pool._cmdBuffers.Get()[i];
|
||||
@@ -286,8 +288,7 @@ void CmdBufferManagerVulkan::PrepareForNewActiveCommandBuffer()
|
||||
if (cmdBuffer->GetState() == CmdBufferVulkan::State::ReadyForBegin)
|
||||
{
|
||||
_activeCmdBuffer = cmdBuffer;
|
||||
_activeCmdBuffer->Begin();
|
||||
return;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -295,8 +296,12 @@ void CmdBufferManagerVulkan::PrepareForNewActiveCommandBuffer()
|
||||
}
|
||||
}
|
||||
|
||||
// Always begin fresh command buffer for rendering
|
||||
_activeCmdBuffer = _pool.Create();
|
||||
if (_activeCmdBuffer == nullptr)
|
||||
{
|
||||
// Always begin fresh command buffer for rendering
|
||||
_activeCmdBuffer = _pool.Create();
|
||||
}
|
||||
|
||||
_activeCmdBuffer->Begin();
|
||||
|
||||
#if VULKAN_USE_QUERIES
|
||||
|
||||
@@ -247,8 +247,7 @@ void TypedDescriptorPoolSetVulkan::Reset()
|
||||
|
||||
DescriptorPoolSetContainerVulkan::DescriptorPoolSetContainerVulkan(GPUDeviceVulkan* device)
|
||||
: _device(device)
|
||||
, _lastFrameUsed(Engine::FrameCount)
|
||||
, _used(true)
|
||||
, LastFrameUsed(Engine::FrameCount)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -278,12 +277,6 @@ void DescriptorPoolSetContainerVulkan::Reset()
|
||||
}
|
||||
}
|
||||
|
||||
void DescriptorPoolSetContainerVulkan::SetUsed(bool used)
|
||||
{
|
||||
_used = used;
|
||||
_lastFrameUsed = used ? Engine::FrameCount : _lastFrameUsed;
|
||||
}
|
||||
|
||||
DescriptorPoolsManagerVulkan::DescriptorPoolsManagerVulkan(GPUDeviceVulkan* device)
|
||||
: _device(device)
|
||||
{
|
||||
@@ -294,26 +287,21 @@ DescriptorPoolsManagerVulkan::~DescriptorPoolsManagerVulkan()
|
||||
_poolSets.ClearDelete();
|
||||
}
|
||||
|
||||
DescriptorPoolSetContainerVulkan& DescriptorPoolsManagerVulkan::AcquirePoolSetContainer()
|
||||
DescriptorPoolSetContainerVulkan* DescriptorPoolsManagerVulkan::AcquirePoolSetContainer()
|
||||
{
|
||||
ScopeLock lock(_locker);
|
||||
for (auto* poolSet : _poolSets)
|
||||
{
|
||||
if (poolSet->IsUnused())
|
||||
if (poolSet->Refs == 0)
|
||||
{
|
||||
poolSet->SetUsed(true);
|
||||
poolSet->LastFrameUsed = Engine::FrameCount;
|
||||
poolSet->Reset();
|
||||
return *poolSet;
|
||||
return poolSet;
|
||||
}
|
||||
}
|
||||
const auto poolSet = New<DescriptorPoolSetContainerVulkan>(_device);
|
||||
_poolSets.Add(poolSet);
|
||||
return *poolSet;
|
||||
}
|
||||
|
||||
void DescriptorPoolsManagerVulkan::ReleasePoolSet(DescriptorPoolSetContainerVulkan& poolSet)
|
||||
{
|
||||
poolSet.SetUsed(false);
|
||||
return poolSet;
|
||||
}
|
||||
|
||||
void DescriptorPoolsManagerVulkan::GC()
|
||||
@@ -322,7 +310,7 @@ void DescriptorPoolsManagerVulkan::GC()
|
||||
for (int32 i = _poolSets.Count() - 1; i >= 0; i--)
|
||||
{
|
||||
const auto poolSet = _poolSets[i];
|
||||
if (poolSet->IsUnused() && Engine::FrameCount - poolSet->GetLastFrameUsed() > VULKAN_RESOURCE_DELETE_SAFE_FRAMES_COUNT)
|
||||
if (poolSet->Refs == 0 && Engine::FrameCount - poolSet->LastFrameUsed > VULKAN_RESOURCE_DELETE_SAFE_FRAMES_COUNT)
|
||||
{
|
||||
_poolSets.RemoveAt(i);
|
||||
Delete(poolSet);
|
||||
|
||||
@@ -212,8 +212,6 @@ class DescriptorPoolSetContainerVulkan
|
||||
private:
|
||||
GPUDeviceVulkan* _device;
|
||||
Dictionary<uint32, TypedDescriptorPoolSetVulkan*> _typedDescriptorPools;
|
||||
uint64 _lastFrameUsed;
|
||||
bool _used;
|
||||
|
||||
public:
|
||||
DescriptorPoolSetContainerVulkan(GPUDeviceVulkan* device);
|
||||
@@ -222,17 +220,9 @@ public:
|
||||
public:
|
||||
TypedDescriptorPoolSetVulkan* AcquireTypedPoolSet(const DescriptorSetLayoutVulkan& layout);
|
||||
void Reset();
|
||||
void SetUsed(bool used);
|
||||
|
||||
bool IsUnused() const
|
||||
{
|
||||
return !_used;
|
||||
}
|
||||
|
||||
uint64 GetLastFrameUsed() const
|
||||
{
|
||||
return _lastFrameUsed;
|
||||
}
|
||||
mutable uint64 Refs = 0;
|
||||
mutable uint64 LastFrameUsed;
|
||||
};
|
||||
|
||||
class DescriptorPoolsManagerVulkan
|
||||
@@ -246,8 +236,7 @@ public:
|
||||
DescriptorPoolsManagerVulkan(GPUDeviceVulkan* device);
|
||||
~DescriptorPoolsManagerVulkan();
|
||||
|
||||
DescriptorPoolSetContainerVulkan& AcquirePoolSetContainer();
|
||||
void ReleasePoolSet(DescriptorPoolSetContainerVulkan& poolSet);
|
||||
DescriptorPoolSetContainerVulkan* AcquirePoolSetContainer();
|
||||
void GC();
|
||||
};
|
||||
|
||||
|
||||
@@ -112,7 +112,11 @@ ComputePipelineStateVulkan::ComputePipelineStateVulkan(GPUDeviceVulkan* device,
|
||||
ComputePipelineStateVulkan::~ComputePipelineStateVulkan()
|
||||
{
|
||||
DSWriteContainer.Release();
|
||||
CurrentTypedDescriptorPoolSet = nullptr;
|
||||
if (CurrentTypedDescriptorPoolSet)
|
||||
{
|
||||
CurrentTypedDescriptorPoolSet->GetOwner()->Refs--;
|
||||
CurrentTypedDescriptorPoolSet = nullptr;
|
||||
}
|
||||
DescriptorSetsLayout = nullptr;
|
||||
DescriptorSetHandles.Resize(0);
|
||||
DynamicOffsets.Resize(0);
|
||||
@@ -206,7 +210,11 @@ VkPipeline GPUPipelineStateVulkan::GetState(RenderPassVulkan* renderPass)
|
||||
void GPUPipelineStateVulkan::OnReleaseGPU()
|
||||
{
|
||||
DSWriteContainer.Release();
|
||||
CurrentTypedDescriptorPoolSet = nullptr;
|
||||
if (CurrentTypedDescriptorPoolSet)
|
||||
{
|
||||
CurrentTypedDescriptorPoolSet->GetOwner()->Refs--;
|
||||
CurrentTypedDescriptorPoolSet = nullptr;
|
||||
}
|
||||
DescriptorSetsLayout = nullptr;
|
||||
DescriptorSetHandles.Resize(0);
|
||||
DynamicOffsets.Resize(0);
|
||||
|
||||
@@ -41,17 +41,17 @@ public:
|
||||
DescriptorPoolSetContainerVulkan* cmdBufferPoolSet = cmdBuffer->GetDescriptorPoolSet();
|
||||
if (CurrentTypedDescriptorPoolSet == nullptr || CurrentTypedDescriptorPoolSet->GetOwner() != cmdBufferPoolSet)
|
||||
{
|
||||
ASSERT(cmdBufferPoolSet);
|
||||
if (CurrentTypedDescriptorPoolSet)
|
||||
CurrentTypedDescriptorPoolSet->GetOwner()->Refs--;
|
||||
CurrentTypedDescriptorPoolSet = cmdBufferPoolSet->AcquireTypedPoolSet(*DescriptorSetsLayout);
|
||||
CurrentTypedDescriptorPoolSet->GetOwner()->Refs++;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool AllocateDescriptorSets()
|
||||
{
|
||||
ASSERT(CurrentTypedDescriptorPoolSet);
|
||||
return CurrentTypedDescriptorPoolSet->AllocateDescriptorSets(*DescriptorSetsLayout, DescriptorSetHandles.Get());
|
||||
}
|
||||
|
||||
@@ -165,7 +165,10 @@ public:
|
||||
DescriptorPoolSetContainerVulkan* cmdBufferPoolSet = cmdBuffer->GetDescriptorPoolSet();
|
||||
if (CurrentTypedDescriptorPoolSet == nullptr || CurrentTypedDescriptorPoolSet->GetOwner() != cmdBufferPoolSet)
|
||||
{
|
||||
if (CurrentTypedDescriptorPoolSet)
|
||||
CurrentTypedDescriptorPoolSet->GetOwner()->Refs--;
|
||||
CurrentTypedDescriptorPoolSet = cmdBufferPoolSet->AcquireTypedPoolSet(*DescriptorSetsLayout);
|
||||
CurrentTypedDescriptorPoolSet->GetOwner()->Refs++;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user