Add **GPU Memory profiler** to Editor

This commit is contained in:
Wojciech Figat
2022-12-08 16:30:37 +01:00
parent f2c594569d
commit df82a0f5d0
47 changed files with 548 additions and 195 deletions

View File

@@ -190,9 +190,9 @@ public:
public:
// [GPUResourceDX12]
ResourceType GetResourceType() const override
GPUResourceType GetResourceType() const override
{
return ResourceType::Descriptor;
return GPUResourceType::Descriptor;
}
protected:

View File

@@ -128,9 +128,9 @@ void DescriptorHeapWithSlotsDX12::ReleaseSlot(uint32 index)
value &= ~mask;
}
GPUResource::ResourceType DescriptorHeapWithSlotsDX12::GetResourceType() const
GPUResourceType DescriptorHeapWithSlotsDX12::GetResourceType() const
{
return ResourceType::Descriptor;
return GPUResourceType::Descriptor;
}
DescriptorHeapPoolDX12::DescriptorHeapPoolDX12(GPUDeviceDX12* device, D3D12_DESCRIPTOR_HEAP_TYPE type, uint32 descriptorsCountPerHeap, bool shaderVisible)

View File

@@ -87,7 +87,7 @@ public:
public:
// [GPUResourceDX12]
ResourceType GetResourceType() const final override;
GPUResourceType GetResourceType() const final override;
protected:
@@ -170,9 +170,9 @@ public:
public:
// [GPUResourceDX12]
ResourceType GetResourceType() const final override
GPUResourceType GetResourceType() const final override
{
return ResourceType::Descriptor;
return GPUResourceType::Descriptor;
}
protected:

View File

@@ -1299,25 +1299,23 @@ void GPUContextDX12::CopyResource(GPUResource* dstResource, GPUResource* srcReso
auto dstResourceDX12 = dynamic_cast<ResourceOwnerDX12*>(dstResource);
auto srcResourceDX12 = dynamic_cast<ResourceOwnerDX12*>(srcResource);
auto dstBufferDX12 = dynamic_cast<GPUBufferDX12*>(dstResource);
auto srcBufferDX12 = dynamic_cast<GPUBufferDX12*>(srcResource);
auto dstTextureDX12 = dynamic_cast<GPUTextureDX12*>(dstResource);
auto srcTextureDX12 = dynamic_cast<GPUTextureDX12*>(srcResource);
SetResourceState(dstResourceDX12, D3D12_RESOURCE_STATE_COPY_DEST);
SetResourceState(srcResourceDX12, D3D12_RESOURCE_STATE_COPY_SOURCE);
flushRBs();
auto srcType = srcResource->GetObjectType();
auto dstType = dstResource->GetObjectType();
// Buffer -> Buffer
if (srcType == GPUResource::ObjectType::Buffer && dstType == GPUResource::ObjectType::Buffer)
if (srcBufferDX12 && dstBufferDX12)
{
_commandList->CopyResource(dstResourceDX12->GetResource(), srcResourceDX12->GetResource());
}
// Texture -> Texture
else if (srcType == GPUResource::ObjectType::Texture && dstType == GPUResource::ObjectType::Texture)
else if (srcTextureDX12 && dstTextureDX12)
{
auto dstTextureDX12 = static_cast<GPUTextureDX12*>(dstResource);
auto srcTextureDX12 = static_cast<GPUTextureDX12*>(srcResource);
if (dstTextureDX12->IsStaging())
{
// Staging Texture -> Staging Texture
@@ -1388,32 +1386,26 @@ void GPUContextDX12::CopySubresource(GPUResource* dstResource, uint32 dstSubreso
{
ASSERT(dstResource && srcResource);
auto srcType = srcResource->GetObjectType();
auto dstType = dstResource->GetObjectType();
auto dstResourceDX12 = dynamic_cast<ResourceOwnerDX12*>(dstResource);
auto srcResourceDX12 = dynamic_cast<ResourceOwnerDX12*>(srcResource);
auto dstBufferDX12 = dynamic_cast<GPUBufferDX12*>(dstResource);
auto srcBufferDX12 = dynamic_cast<GPUBufferDX12*>(srcResource);
auto dstTextureDX12 = dynamic_cast<GPUTextureDX12*>(dstResource);
auto srcTextureDX12 = dynamic_cast<GPUTextureDX12*>(srcResource);
SetResourceState(dstResourceDX12, D3D12_RESOURCE_STATE_COPY_DEST);
SetResourceState(srcResourceDX12, D3D12_RESOURCE_STATE_COPY_SOURCE);
flushRBs();
// Buffer -> Buffer
if (srcType == GPUResource::ObjectType::Buffer && dstType == GPUResource::ObjectType::Buffer)
if (srcBufferDX12 && dstBufferDX12)
{
auto dstBufferDX12 = dynamic_cast<ResourceOwnerDX12*>(dstResource);
auto srcBufferDX12 = dynamic_cast<ResourceOwnerDX12*>(srcResource);
SetResourceState(dstBufferDX12, D3D12_RESOURCE_STATE_COPY_DEST);
SetResourceState(srcBufferDX12, D3D12_RESOURCE_STATE_COPY_SOURCE);
flushRBs();
uint64 bytesCount = srcResource->GetMemoryUsage();
_commandList->CopyBufferRegion(dstBufferDX12->GetResource(), 0, srcBufferDX12->GetResource(), 0, bytesCount);
}
// Texture -> Texture
else if (srcType == GPUResource::ObjectType::Texture && dstType == GPUResource::ObjectType::Texture)
else if (srcTextureDX12 && dstTextureDX12)
{
auto dstTextureDX12 = static_cast<GPUTextureDX12*>(dstResource);
auto srcTextureDX12 = static_cast<GPUTextureDX12*>(srcResource);
SetResourceState(dstTextureDX12, D3D12_RESOURCE_STATE_COPY_DEST);
SetResourceState(srcTextureDX12, D3D12_RESOURCE_STATE_COPY_SOURCE);
flushRBs();
if (srcTextureDX12->IsStaging() || dstTextureDX12->IsStaging())
{
Log::NotImplementedException(TEXT("Copy region of staging resources is not supported yet."));

View File

@@ -56,9 +56,9 @@ public:
public:
// [GPUResourceDX12]
ResourceType GetResourceType() const final override
GPUResourceType GetResourceType() const final override
{
return ResourceType::Buffer;
return GPUResourceType::Buffer;
}
// [ResourceOwnerDX12]

View File

@@ -87,7 +87,7 @@ namespace DescriptorSet
return ShaderStage::Geometry;
default:
CRASH;
return static_cast<ShaderStage>(ShaderStage_Count);
return (ShaderStage)ShaderStage_Count;
}
}

View File

@@ -5,6 +5,7 @@
#include "GPUBufferVulkan.h"
#include "GPUContextVulkan.h"
#include "RenderToolsVulkan.h"
#include "Engine/Core/Log.h"
#include "Engine/Threading/Threading.h"
#include "Engine/Graphics/Async/Tasks/GPUUploadBufferTask.h"

View File

@@ -1493,17 +1493,13 @@ void GPUContextVulkan::CopyResource(GPUResource* dstResource, GPUResource* srcRe
if (cmdBuffer->IsInsideRenderPass())
EndRenderPass();
auto dstTextureVulkan = static_cast<GPUTextureVulkan*>(dstResource);
auto srcTextureVulkan = static_cast<GPUTextureVulkan*>(srcResource);
auto dstBufferVulkan = static_cast<GPUBufferVulkan*>(dstResource);
auto srcBufferVulkan = static_cast<GPUBufferVulkan*>(srcResource);
const auto srcType = srcResource->GetObjectType();
const auto dstType = dstResource->GetObjectType();
auto dstTextureVulkan = dynamic_cast<GPUTextureVulkan*>(dstResource);
auto srcTextureVulkan = dynamic_cast<GPUTextureVulkan*>(srcResource);
auto dstBufferVulkan = dynamic_cast<GPUBufferVulkan*>(dstResource);
auto srcBufferVulkan = dynamic_cast<GPUBufferVulkan*>(srcResource);
// Buffer -> Buffer
if (srcType == GPUResource::ObjectType::Buffer && dstType == GPUResource::ObjectType::Buffer)
if (srcBufferVulkan && dstBufferVulkan)
{
// Transition resources
AddBufferBarrier(dstBufferVulkan, VK_ACCESS_TRANSFER_WRITE_BIT);
@@ -1519,7 +1515,7 @@ void GPUContextVulkan::CopyResource(GPUResource* dstResource, GPUResource* srcRe
vkCmdCopyBuffer(cmdBuffer->GetHandle(), srcBufferVulkan->GetHandle(), dstBufferVulkan->GetHandle(), 1, &bufferCopy);
}
// Texture -> Texture
else if (srcType == GPUResource::ObjectType::Texture && dstType == GPUResource::ObjectType::Texture)
else if (srcTextureVulkan && dstTextureVulkan)
{
if (dstTextureVulkan->IsStaging())
{
@@ -1632,17 +1628,13 @@ void GPUContextVulkan::CopySubresource(GPUResource* dstResource, uint32 dstSubre
if (cmdBuffer->IsInsideRenderPass())
EndRenderPass();
auto dstTextureVulkan = static_cast<GPUTextureVulkan*>(dstResource);
auto srcTextureVulkan = static_cast<GPUTextureVulkan*>(srcResource);
auto dstBufferVulkan = static_cast<GPUBufferVulkan*>(dstResource);
auto srcBufferVulkan = static_cast<GPUBufferVulkan*>(srcResource);
auto srcType = srcResource->GetObjectType();
auto dstType = dstResource->GetObjectType();
auto dstTextureVulkan = dynamic_cast<GPUTextureVulkan*>(dstResource);
auto srcTextureVulkan = dynamic_cast<GPUTextureVulkan*>(srcResource);
auto dstBufferVulkan = dynamic_cast<GPUBufferVulkan*>(dstResource);
auto srcBufferVulkan = dynamic_cast<GPUBufferVulkan*>(srcResource);
// Buffer -> Buffer
if (srcType == GPUResource::ObjectType::Buffer && dstType == GPUResource::ObjectType::Buffer)
if (srcBufferVulkan && dstBufferVulkan)
{
ASSERT(dstSubresource == 0 && srcSubresource == 0);
@@ -1660,7 +1652,7 @@ void GPUContextVulkan::CopySubresource(GPUResource* dstResource, uint32 dstSubre
vkCmdCopyBuffer(cmdBuffer->GetHandle(), srcBufferVulkan->GetHandle(), dstBufferVulkan->GetHandle(), 1, &bufferCopy);
}
// Texture -> Texture
else if (srcType == GPUResource::ObjectType::Texture && dstType == GPUResource::ObjectType::Texture)
else if (srcTextureVulkan && dstTextureVulkan)
{
const int32 dstMipMaps = dstTextureVulkan->MipLevels();
const int32 dstMipIndex = dstSubresource % dstMipMaps;

View File

@@ -67,9 +67,9 @@ public:
public:
// [GPUResourceVulkan]
ResourceType GetResourceType() const final override
GPUResourceType GetResourceType() const final override
{
return ResourceType::Buffer;
return GPUResourceType::Buffer;
}
// [ResourceOwnerVulkan]