Codestyle fixes and optimizations

This commit is contained in:
Wojtek Figat
2024-01-29 13:46:50 +01:00
parent 1b33a2aa0d
commit bb00d29098
25 changed files with 163 additions and 486 deletions

View File

@@ -129,15 +129,13 @@ void CmdBufferVulkan::RefreshFenceStatus()
{
if (_state == State::Submitted)
{
auto fenceManager = _fence->GetOwner();
if (fenceManager->IsFenceSignaled(_fence))
if (_device->FenceManager.IsFenceSignaled(_fence))
{
_state = State::ReadyForBegin;
_submittedWaitSemaphores.Clear();
vkResetCommandBuffer(_commandBuffer, VK_COMMAND_BUFFER_RESET_RELEASE_RESOURCES_BIT);
_fence->GetOwner()->ResetFence(_fence);
_device->FenceManager.ResetFence(_fence);
_fenceSignaledCounter++;
if (_descriptorPoolSetContainer)
@@ -149,7 +147,7 @@ void CmdBufferVulkan::RefreshFenceStatus()
}
else
{
ASSERT(!_fence->IsSignaled());
ASSERT(!_fence->IsSignaled);
}
}
@@ -158,8 +156,8 @@ CmdBufferVulkan::CmdBufferVulkan(GPUDeviceVulkan* device, CmdBufferPoolVulkan* p
, _commandBuffer(VK_NULL_HANDLE)
, _state(State::ReadyForBegin)
, _fence(nullptr)
, _fenceSignaledCounter(0)
, _submittedFenceCounter(0)
, _fenceSignaledCounter(0)
, _commandBufferPool(pool)
{
VkCommandBufferAllocateInfo createCmdBufInfo;
@@ -167,7 +165,6 @@ CmdBufferVulkan::CmdBufferVulkan(GPUDeviceVulkan* device, CmdBufferPoolVulkan* p
createCmdBufInfo.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
createCmdBufInfo.commandBufferCount = 1;
createCmdBufInfo.commandPool = _commandBufferPool->GetHandle();
VALIDATE_VULKAN_RESULT(vkAllocateCommandBuffers(_device->Device, &createCmdBufInfo, &_commandBuffer));
_fence = _device->FenceManager.AllocateFence();
}
@@ -217,17 +214,16 @@ CmdBufferPoolVulkan::~CmdBufferPoolVulkan()
{
for (int32 i = 0; i < _cmdBuffers.Count(); i++)
{
Delete(_cmdBuffers[i]);
Delete(_cmdBuffers.Get()[i]);
}
vkDestroyCommandPool(_device->Device, _handle, nullptr);
}
void CmdBufferPoolVulkan::RefreshFenceStatus(CmdBufferVulkan* skipCmdBuffer)
void CmdBufferPoolVulkan::RefreshFenceStatus(const CmdBufferVulkan* skipCmdBuffer)
{
for (int32 i = 0; i < _cmdBuffers.Count(); i++)
{
auto cmdBuffer = _cmdBuffers[i];
const auto cmdBuffer = _cmdBuffers.Get()[i];
if (cmdBuffer != skipCmdBuffer)
{
cmdBuffer->RefreshFenceStatus();
@@ -250,9 +246,8 @@ void CmdBufferManagerVulkan::SubmitActiveCmdBuffer(SemaphoreVulkan* signalSemaph
if (!_activeCmdBuffer->IsSubmitted() && _activeCmdBuffer->HasBegun())
{
if (_activeCmdBuffer->IsInsideRenderPass())
{
_activeCmdBuffer->EndRenderPass();
}
#if VULKAN_USE_QUERIES
// Pause all active queries

View File

@@ -21,7 +21,6 @@ class CmdBufferVulkan
friend QueueVulkan;
public:
enum class State
{
ReadyForBegin,
@@ -32,7 +31,6 @@ public:
};
private:
GPUDeviceVulkan* _device;
VkCommandBuffer _commandBuffer;
State _state;
@@ -57,13 +55,11 @@ private:
DescriptorPoolSetContainerVulkan* _descriptorPoolSetContainer = nullptr;
public:
CmdBufferVulkan(GPUDeviceVulkan* device, CmdBufferPoolVulkan* pool);
~CmdBufferVulkan();
public:
CmdBufferPoolVulkan* GetOwner() const
{
return _commandBufferPool;
@@ -120,7 +116,6 @@ public:
}
public:
void AddWaitSemaphore(VkPipelineStageFlags waitFlags, SemaphoreVulkan* waitSemaphore);
void Begin();
@@ -147,8 +142,8 @@ public:
class CmdBufferPoolVulkan
{
friend class CmdBufferManagerVulkan;
private:
private:
GPUDeviceVulkan* _device;
VkCommandPool _handle;
Array<CmdBufferVulkan*> _cmdBuffers;
@@ -158,25 +153,22 @@ private:
void Create(uint32 queueFamilyIndex);
public:
CmdBufferPoolVulkan(GPUDeviceVulkan* device);
~CmdBufferPoolVulkan();
public:
inline VkCommandPool GetHandle() const
{
ASSERT(_handle != VK_NULL_HANDLE);
return _handle;
}
void RefreshFenceStatus(CmdBufferVulkan* skipCmdBuffer = nullptr);
void RefreshFenceStatus(const CmdBufferVulkan* skipCmdBuffer = nullptr);
};
class CmdBufferManagerVulkan
{
private:
GPUDeviceVulkan* _device;
CmdBufferPoolVulkan _pool;
QueueVulkan* _queue;
@@ -184,11 +176,9 @@ private:
Array<GPUTimerQueryVulkan*> _queriesInProgress;
public:
CmdBufferManagerVulkan(GPUDeviceVulkan* device, GPUContextVulkan* context);
public:
FORCE_INLINE VkCommandPool GetHandle() const
{
return _pool.GetHandle();
@@ -217,7 +207,6 @@ public:
}
public:
void SubmitActiveCmdBuffer(SemaphoreVulkan* signalSemaphore = nullptr);
void WaitForCmdBuffer(CmdBufferVulkan* cmdBuffer, float timeInSecondsToWait = 1.0f);

View File

@@ -23,7 +23,7 @@
/// <summary>
/// Default amount of frames to wait until resource delete.
/// </summary>
#define VULKAN_RESOURCE_DELETE_SAFE_FRAMES_COUNT 10
#define VULKAN_RESOURCE_DELETE_SAFE_FRAMES_COUNT 20
#define VULKAN_ENABLE_API_DUMP 0
#define VULKAN_RESET_QUERY_POOLS 0

View File

@@ -12,29 +12,12 @@
#include "Engine/Threading/Threading.h"
#include "Engine/Engine/Engine.h"
void DescriptorSetLayoutInfoVulkan::CacheTypesUsageID()
{
static CriticalSection locker;
static uint32 uniqueID = 1;
static Dictionary<uint32, uint32> typesUsageHashMap;
const uint32 typesUsageHash = Crc::MemCrc32(_layoutTypes, sizeof(_layoutTypes));
ScopeLock lock(locker);
uint32 id;
if (!typesUsageHashMap.TryGet(typesUsageHash, id))
{
id = uniqueID++;
typesUsageHashMap.Add(typesUsageHash, id);
}
_typesUsageID = id;
}
void DescriptorSetLayoutInfoVulkan::AddBindingsForStage(VkShaderStageFlagBits stageFlags, DescriptorSet::Stage descSet, const SpirvShaderDescriptorInfo* descriptorInfo)
{
const int32 descriptorSetIndex = descSet;
if (descriptorSetIndex >= _setLayouts.Count())
_setLayouts.Resize(descriptorSetIndex + 1);
SetLayout& descSetLayout = _setLayouts[descriptorSetIndex];
if (descriptorSetIndex >= SetLayouts.Count())
SetLayouts.Resize(descriptorSetIndex + 1);
SetLayout& descSetLayout = SetLayouts[descriptorSetIndex];
VkDescriptorSetLayoutBinding binding;
binding.stageFlags = stageFlags;
@@ -46,25 +29,26 @@ void DescriptorSetLayoutInfoVulkan::AddBindingsForStage(VkShaderStageFlagBits st
binding.descriptorType = descriptor.DescriptorType;
binding.descriptorCount = descriptor.Count;
_layoutTypes[binding.descriptorType]++;
descSetLayout.LayoutBindings.Add(binding);
_hash = Crc::MemCrc32(&binding, sizeof(binding), _hash);
LayoutTypes[binding.descriptorType]++;
descSetLayout.Add(binding);
Hash = Crc::MemCrc32(&binding, sizeof(binding), Hash);
}
}
bool DescriptorSetLayoutInfoVulkan::operator==(const DescriptorSetLayoutInfoVulkan& other) const
{
if (other._setLayouts.Count() != _setLayouts.Count())
if (other.SetLayouts.Count() != SetLayouts.Count())
return false;
if (other._typesUsageID != _typesUsageID)
if (other.TypesUsageID != TypesUsageID)
return false;
for (int32 index = 0; index < other._setLayouts.Count(); index++)
for (int32 index = 0; index < other.SetLayouts.Count(); index++)
{
const int32 bindingsCount = _setLayouts[index].LayoutBindings.Count();
if (other._setLayouts[index].LayoutBindings.Count() != bindingsCount)
auto& setLayout = SetLayouts[index];
auto& setLayoutOther = other.SetLayouts[index];
if (setLayoutOther.Count() != setLayout.Count())
return false;
if (bindingsCount != 0 && Platform::MemoryCompare(other._setLayouts[index].LayoutBindings.Get(), _setLayouts[index].LayoutBindings.Get(), bindingsCount * sizeof(VkDescriptorSetLayoutBinding)))
if (setLayout.Count() != 0 && Platform::MemoryCompare(setLayoutOther.Get(), setLayout.Get(), setLayout.Count() * sizeof(VkDescriptorSetLayoutBinding)))
return false;
}
@@ -72,51 +56,63 @@ bool DescriptorSetLayoutInfoVulkan::operator==(const DescriptorSetLayoutInfoVulk
}
DescriptorSetLayoutVulkan::DescriptorSetLayoutVulkan(GPUDeviceVulkan* device)
: _device(device)
: Device(device)
{
}
DescriptorSetLayoutVulkan::~DescriptorSetLayoutVulkan()
{
for (VkDescriptorSetLayout& handle : _handles)
for (VkDescriptorSetLayout& handle : Handles)
{
_device->DeferredDeletionQueue.EnqueueResource(DeferredDeletionQueueVulkan::Type::DescriptorSetLayout, handle);
Device->DeferredDeletionQueue.EnqueueResource(DeferredDeletionQueueVulkan::Type::DescriptorSetLayout, handle);
}
}
void DescriptorSetLayoutVulkan::Compile()
{
ASSERT(_handles.IsEmpty());
ASSERT(Handles.IsEmpty());
// Validate device limits for the engine
const VkPhysicalDeviceLimits& limits = _device->PhysicalDeviceLimits;
ASSERT(_layoutTypes[VK_DESCRIPTOR_TYPE_SAMPLER] + _layoutTypes[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] < limits.maxDescriptorSetSamplers);
ASSERT(_layoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER]+ _layoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] < limits.maxDescriptorSetUniformBuffers);
ASSERT(_layoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] < limits.maxDescriptorSetUniformBuffersDynamic);
ASSERT(_layoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER] + _layoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] < limits.maxDescriptorSetStorageBuffers);
ASSERT(_layoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] < limits.maxDescriptorSetStorageBuffersDynamic);
ASSERT(_layoutTypes[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] + _layoutTypes[VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] + _layoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER] < limits.maxDescriptorSetSampledImages);
ASSERT(_layoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] + _layoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER]< limits.maxDescriptorSetStorageImages);
const VkPhysicalDeviceLimits& limits = Device->PhysicalDeviceLimits;
ASSERT(LayoutTypes[VK_DESCRIPTOR_TYPE_SAMPLER] + LayoutTypes[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] < limits.maxDescriptorSetSamplers);
ASSERT(LayoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER]+ LayoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] < limits.maxDescriptorSetUniformBuffers);
ASSERT(LayoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC] < limits.maxDescriptorSetUniformBuffersDynamic);
ASSERT(LayoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER] + LayoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] < limits.maxDescriptorSetStorageBuffers);
ASSERT(LayoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC] < limits.maxDescriptorSetStorageBuffersDynamic);
ASSERT(LayoutTypes[VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER] + LayoutTypes[VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE] + LayoutTypes[VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER] < limits.maxDescriptorSetSampledImages);
ASSERT(LayoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_IMAGE] + LayoutTypes[VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER]< limits.maxDescriptorSetStorageImages);
_handles.Resize(_setLayouts.Count());
for (int32 i = 0; i < _setLayouts.Count(); i++)
Handles.Resize(SetLayouts.Count());
for (int32 i = 0; i < SetLayouts.Count(); i++)
{
auto& layout = _setLayouts[i];
auto& layout = SetLayouts[i];
VkDescriptorSetLayoutCreateInfo layoutInfo;
RenderToolsVulkan::ZeroStruct(layoutInfo, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO);
layoutInfo.bindingCount = layout.LayoutBindings.Count();
layoutInfo.pBindings = layout.LayoutBindings.Get();
VALIDATE_VULKAN_RESULT(vkCreateDescriptorSetLayout(_device->Device, &layoutInfo, nullptr, &_handles[i]));
layoutInfo.bindingCount = layout.Count();
layoutInfo.pBindings = layout.Get();
VALIDATE_VULKAN_RESULT(vkCreateDescriptorSetLayout(Device->Device, &layoutInfo, nullptr, &Handles[i]));
}
if (_typesUsageID == ~0)
if (TypesUsageID == ~0)
{
CacheTypesUsageID();
// Cache usage ID
static uint32 uniqueID = 1;
static Dictionary<uint32, uint32> typesUsageHashMap;
const uint32 typesUsageHash = Crc::MemCrc32(LayoutTypes, sizeof(LayoutTypes));
uint32 id;
Device->Locker.Lock();
if (!typesUsageHashMap.TryGet(typesUsageHash, id))
{
id = uniqueID++;
typesUsageHashMap.Add(typesUsageHash, id);
}
Device->Locker.Unlock();
TypesUsageID = id;
}
RenderToolsVulkan::ZeroStruct(_allocateInfo, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO);
_allocateInfo.descriptorSetCount = _handles.Count();
_allocateInfo.pSetLayouts = _handles.Get();
RenderToolsVulkan::ZeroStruct(AllocateInfo, VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO);
AllocateInfo.descriptorSetCount = Handles.Count();
AllocateInfo.pSetLayouts = Handles.Get();
}
DescriptorPoolVulkan::DescriptorPoolVulkan(GPUDeviceVulkan* device, const DescriptorSetLayoutVulkan& layout)
@@ -131,11 +127,11 @@ DescriptorPoolVulkan::DescriptorPoolVulkan(GPUDeviceVulkan* device, const Descri
// The maximum amount of descriptor sets layout allocations to hold
const uint32 MaxSetsAllocations = 256;
_descriptorSetsMax = MaxSetsAllocations * (VULKAN_HASH_POOLS_WITH_TYPES_USAGE_ID ? 1 : _layout.GetLayouts().Count());
_descriptorSetsMax = MaxSetsAllocations * (VULKAN_HASH_POOLS_WITH_TYPES_USAGE_ID ? 1 : _layout.SetLayouts.Count());
for (uint32 typeIndex = VULKAN_DESCRIPTOR_TYPE_BEGIN; typeIndex <= VULKAN_DESCRIPTOR_TYPE_END; typeIndex++)
{
const VkDescriptorType descriptorType = (VkDescriptorType)typeIndex;
const uint32 typesUsed = _layout.GetTypesUsed(descriptorType);
const uint32 typesUsed = _layout.LayoutTypes[descriptorType];
if (typesUsed > 0)
{
VkDescriptorPoolSize& type = types.AddOne();
@@ -167,22 +163,22 @@ void DescriptorPoolVulkan::Track(const DescriptorSetLayoutVulkan& layout)
#if !BUILD_RELEASE
for (uint32 typeIndex = VULKAN_DESCRIPTOR_TYPE_BEGIN; typeIndex <= VULKAN_DESCRIPTOR_TYPE_END; typeIndex++)
{
ASSERT(_layout.GetTypesUsed((VkDescriptorType)typeIndex) == layout.GetTypesUsed((VkDescriptorType)typeIndex));
ASSERT(_layout.LayoutTypes[typeIndex] == layout.LayoutTypes[typeIndex]);
}
#endif
_allocatedDescriptorSetsCount += layout.GetLayouts().Count();
_allocatedDescriptorSetsCount += layout.SetLayouts.Count();
_allocatedDescriptorSetsCountMax = Math::Max(_allocatedDescriptorSetsCount, _allocatedDescriptorSetsCountMax);
}
void DescriptorPoolVulkan::TrackRemoveUsage(const DescriptorSetLayoutVulkan& layout)
{
// Check and increment our current type usage
#if !BUILD_RELEASE
for (uint32 typeIndex = VULKAN_DESCRIPTOR_TYPE_BEGIN; typeIndex <= VULKAN_DESCRIPTOR_TYPE_END; typeIndex++)
{
ASSERT(_layout.GetTypesUsed((VkDescriptorType)typeIndex) == layout.GetTypesUsed((VkDescriptorType)typeIndex));
ASSERT(_layout.LayoutTypes[typeIndex] == layout.LayoutTypes[typeIndex]);
}
_allocatedDescriptorSetsCount -= layout.GetLayouts().Count();
#endif
_allocatedDescriptorSetsCount -= layout.SetLayouts.Count();
}
void DescriptorPoolVulkan::Reset()
@@ -214,11 +210,10 @@ TypedDescriptorPoolSetVulkan::~TypedDescriptorPoolSetVulkan()
bool TypedDescriptorPoolSetVulkan::AllocateDescriptorSets(const DescriptorSetLayoutVulkan& layout, VkDescriptorSet* outSets)
{
const auto& layoutHandles = layout.GetHandles();
if (layoutHandles.HasItems())
if (layout.Handles.HasItems())
{
auto* pool = _poolListCurrent->Element;
while (!pool->AllocateDescriptorSets(layout.GetAllocateInfo(), outSets))
while (!pool->AllocateDescriptorSets(layout.AllocateInfo, outSets))
{
pool = GetFreePool(true);
}
@@ -279,7 +274,7 @@ DescriptorPoolSetContainerVulkan::~DescriptorPoolSetContainerVulkan()
TypedDescriptorPoolSetVulkan* DescriptorPoolSetContainerVulkan::AcquireTypedPoolSet(const DescriptorSetLayoutVulkan& layout)
{
const uint32 hash = VULKAN_HASH_POOLS_WITH_TYPES_USAGE_ID ? layout.GetTypesUsageID() : GetHash(layout);
const uint32 hash = VULKAN_HASH_POOLS_WITH_TYPES_USAGE_ID ? layout.TypesUsageID : layout.Hash;
TypedDescriptorPoolSetVulkan* typedPool;
if (!_typedDescriptorPools.TryGet(hash, typedPool))
{
@@ -361,12 +356,10 @@ PipelineLayoutVulkan::PipelineLayoutVulkan(GPUDeviceVulkan* device, const Descri
_descriptorSetLayout.CopyFrom(layout);
_descriptorSetLayout.Compile();
const auto& layoutHandles = _descriptorSetLayout.GetHandles();
VkPipelineLayoutCreateInfo createInfo;
RenderToolsVulkan::ZeroStruct(createInfo, VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO);
createInfo.setLayoutCount = layoutHandles.Count();
createInfo.pSetLayouts = layoutHandles.Get();
createInfo.setLayoutCount = _descriptorSetLayout.Handles.Count();
createInfo.pSetLayouts = _descriptorSetLayout.Handles.Get();
VALIDATE_VULKAN_RESULT(vkCreatePipelineLayout(_device->Device, &createInfo, nullptr, &_handle));
}

View File

@@ -54,106 +54,62 @@ namespace DescriptorSet
class DescriptorSetLayoutInfoVulkan
{
public:
typedef Array<VkDescriptorSetLayoutBinding> SetLayout;
struct SetLayout
{
Array<VkDescriptorSetLayoutBinding> LayoutBindings;
};
protected:
uint32 _layoutTypes[VULKAN_DESCRIPTOR_TYPE_END];
Array<SetLayout> _setLayouts;
uint32 _hash = 0;
uint32 _typesUsageID = ~0;
uint32 Hash = 0;
uint32 TypesUsageID = ~0;
Array<SetLayout> SetLayouts;
uint32 LayoutTypes[VULKAN_DESCRIPTOR_TYPE_END];
void CacheTypesUsageID();
public:
DescriptorSetLayoutInfoVulkan()
{
Platform::MemoryClear(_layoutTypes, sizeof(_layoutTypes));
Platform::MemoryClear(LayoutTypes, sizeof(LayoutTypes));
}
public:
inline uint32 GetTypesUsed(VkDescriptorType type) const
{
return _layoutTypes[type];
}
const Array<SetLayout>& GetLayouts() const
{
return _setLayouts;
}
inline uint32 GetTypesUsageID() const
{
return _typesUsageID;
}
public:
void AddBindingsForStage(VkShaderStageFlagBits stageFlags, DescriptorSet::Stage descSet, const SpirvShaderDescriptorInfo* descriptorInfo);
void CopyFrom(const DescriptorSetLayoutInfoVulkan& info)
{
Platform::MemoryCopy(_layoutTypes, info._layoutTypes, sizeof(_layoutTypes));
_hash = info._hash;
_typesUsageID = info._typesUsageID;
_setLayouts = info._setLayouts;
Platform::MemoryCopy(LayoutTypes, info.LayoutTypes, sizeof(LayoutTypes));
Hash = info.Hash;
TypesUsageID = info.TypesUsageID;
SetLayouts = info.SetLayouts;
}
bool operator==(const DescriptorSetLayoutInfoVulkan& other) const;
friend inline uint32 GetHash(const DescriptorSetLayoutInfoVulkan& key)
{
return key._hash;
return key.Hash;
}
};
class DescriptorSetLayoutVulkan : public DescriptorSetLayoutInfoVulkan
{
public:
typedef Array<VkDescriptorSetLayout, FixedAllocation<DescriptorSet::Max>> HandlesArray;
typedef Array<VkDescriptorSetLayout, FixedAllocation<DescriptorSet::Max>> DescriptorSetLayoutHandlesArray;
private:
GPUDeviceVulkan* _device;
DescriptorSetLayoutHandlesArray _handles;
VkDescriptorSetAllocateInfo _allocateInfo;
public:
GPUDeviceVulkan* Device;
HandlesArray Handles;
VkDescriptorSetAllocateInfo AllocateInfo;
DescriptorSetLayoutVulkan(GPUDeviceVulkan* device);
~DescriptorSetLayoutVulkan();
public:
inline const DescriptorSetLayoutHandlesArray& GetHandles() const
{
return _handles;
}
inline const VkDescriptorSetAllocateInfo& GetAllocateInfo() const
{
return _allocateInfo;
}
void Compile();
friend inline uint32 GetHash(const DescriptorSetLayoutVulkan& key)
{
return key._hash;
return key.Hash;
}
void Compile();
};
class DescriptorPoolVulkan
{
private:
GPUDeviceVulkan* _device;
VkDescriptorPool _handle;
@@ -164,12 +120,10 @@ private:
const DescriptorSetLayoutVulkan& _layout;
public:
DescriptorPoolVulkan(GPUDeviceVulkan* device, const DescriptorSetLayoutVulkan& layout);
~DescriptorPoolVulkan();
public:
inline VkDescriptorPool GetHandle() const
{
return _handle;
@@ -182,7 +136,7 @@ public:
inline bool CanAllocate(const DescriptorSetLayoutVulkan& layout) const
{
return _descriptorSetsMax > _allocatedDescriptorSetsCount + layout.GetLayouts().Count();
return _descriptorSetsMax > _allocatedDescriptorSetsCount + layout.SetLayouts.Count();
}
inline uint32 GetAllocatedDescriptorSetsCount() const
@@ -191,7 +145,6 @@ public:
}
public:
void Track(const DescriptorSetLayoutVulkan& layout);
void TrackRemoveUsage(const DescriptorSetLayoutVulkan& layout);
void Reset();
@@ -205,7 +158,6 @@ class TypedDescriptorPoolSetVulkan
friend DescriptorPoolSetContainerVulkan;
private:
GPUDeviceVulkan* _device;
const DescriptorPoolSetContainerVulkan* _owner;
const DescriptorSetLayoutVulkan& _layout;
@@ -213,7 +165,6 @@ private:
class PoolList
{
public:
DescriptorPoolVulkan* Element;
PoolList* Next;
@@ -228,7 +179,6 @@ private:
PoolList* _poolListCurrent = nullptr;
public:
TypedDescriptorPoolSetVulkan(GPUDeviceVulkan* device, const DescriptorPoolSetContainerVulkan* owner, const DescriptorSetLayoutVulkan& layout)
: _device(device)
, _owner(owner)
@@ -247,7 +197,6 @@ public:
}
private:
DescriptorPoolVulkan* GetFreePool(bool forceNewPool = false);
DescriptorPoolVulkan* PushNewPool();
void Reset();
@@ -256,20 +205,16 @@ private:
class DescriptorPoolSetContainerVulkan
{
private:
GPUDeviceVulkan* _device;
Dictionary<uint32, TypedDescriptorPoolSetVulkan*> _typedDescriptorPools;
uint64 _lastFrameUsed;
bool _used;
public:
DescriptorPoolSetContainerVulkan(GPUDeviceVulkan* device);
~DescriptorPoolSetContainerVulkan();
public:
TypedDescriptorPoolSetVulkan* AcquireTypedPoolSet(const DescriptorSetLayoutVulkan& layout);
void Reset();
void SetUsed(bool used);
@@ -288,13 +233,11 @@ public:
class DescriptorPoolsManagerVulkan
{
private:
GPUDeviceVulkan* _device = nullptr;
CriticalSection _locker;
Array<DescriptorPoolSetContainerVulkan*> _poolSets;
public:
DescriptorPoolsManagerVulkan(GPUDeviceVulkan* device);
~DescriptorPoolsManagerVulkan();
@@ -306,25 +249,20 @@ public:
class PipelineLayoutVulkan
{
private:
GPUDeviceVulkan* _device;
VkPipelineLayout _handle;
DescriptorSetLayoutVulkan _descriptorSetLayout;
public:
PipelineLayoutVulkan(GPUDeviceVulkan* device, const DescriptorSetLayoutInfoVulkan& layout);
~PipelineLayoutVulkan();
public:
inline VkPipelineLayout GetHandle() const
{
return _handle;
}
public:
inline const DescriptorSetLayoutVulkan& GetDescriptorSetLayout() const
{
return _descriptorSetLayout;
@@ -332,7 +270,7 @@ public:
inline bool HasDescriptors() const
{
return _descriptorSetLayout.GetLayouts().HasItems();
return _descriptorSetLayout.SetLayouts.HasItems();
}
};
@@ -357,14 +295,12 @@ struct DescriptorSetWriteContainerVulkan
class DescriptorSetWriterVulkan
{
public:
VkWriteDescriptorSet* WriteDescriptors = nullptr;
byte* BindingToDynamicOffset = nullptr;
uint32* DynamicOffsets = nullptr;
uint32 WritesCount = 0;
public:
uint32 SetupDescriptorWrites(const SpirvShaderDescriptorInfo& info, VkWriteDescriptorSet* writeDescriptors, VkDescriptorImageInfo* imageInfo, VkDescriptorBufferInfo* bufferInfo, VkBufferView* texelBufferView, byte* bindingToDynamicOffset);
bool WriteUniformBuffer(uint32 descriptorIndex, VkBuffer buffer, VkDeviceSize offset, VkDeviceSize range, uint32 index = 0) const
@@ -451,9 +387,7 @@ public:
void SetDescriptorSet(VkDescriptorSet descriptorSet) const
{
for (uint32 i = 0; i < WritesCount; i++)
{
WriteDescriptors[i].dstSet = descriptorSet;
}
}
};

View File

@@ -14,7 +14,6 @@
class GPUAdapterVulkan : public GPUAdapter
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUAdapterVulkan"/> class.
/// </summary>
@@ -38,7 +37,6 @@ public:
}
public:
/// <summary>
/// The GPU device handle.
/// </summary>
@@ -55,7 +53,6 @@ public:
String Description;
public:
// [GPUAdapter]
bool IsValid() const override
{

View File

@@ -13,7 +13,6 @@
class GPUBufferViewVulkan : public GPUBufferView, public DescriptorOwnerResourceVulkan
{
public:
GPUBufferViewVulkan()
{
}
@@ -26,7 +25,6 @@ public:
#endif
public:
GPUDeviceVulkan* Device = nullptr;
GPUBufferVulkan* Owner = nullptr;
VkBuffer Buffer = VK_NULL_HANDLE;
@@ -34,13 +32,10 @@ public:
VkDeviceSize Size = 0;
public:
void Init(GPUDeviceVulkan* device, GPUBufferVulkan* owner, VkBuffer buffer, VkDeviceSize size, VkBufferUsageFlags usage, PixelFormat format);
void Release();
public:
// [GPUResourceView]
void* GetNativePtr() const override
{
@@ -59,13 +54,11 @@ public:
class GPUBufferVulkan : public GPUResourceVulkan<GPUBuffer>
{
private:
VkBuffer _buffer = VK_NULL_HANDLE;
VmaAllocation _allocation = VK_NULL_HANDLE;
GPUBufferViewVulkan _view;
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUBufferVulkan"/> class.
/// </summary>
@@ -77,7 +70,6 @@ public:
}
public:
/// <summary>
/// Gets the Vulkan buffer handle.
/// </summary>
@@ -105,14 +97,12 @@ public:
GPUBufferVulkan* Counter = nullptr;
public:
// [GPUBuffer]
GPUBufferView* View() const override;
void* Map(GPUResourceMapMode mode) override;
void Unmap() override;
protected:
// [GPUBuffer]
bool OnInit() override;
void OnReleaseGPU() override;

View File

@@ -20,18 +20,18 @@
// Ensure to match the indirect commands arguments layout
static_assert(sizeof(GPUDispatchIndirectArgs) == sizeof(VkDispatchIndirectCommand), "Wrong size of GPUDrawIndirectArgs.");
static_assert(OFFSET_OF(GPUDispatchIndirectArgs, ThreadGroupCountX) == OFFSET_OF(VkDispatchIndirectCommand, x), "Wrong offset for GPUDrawIndirectArgs::ThreadGroupCountX");
static_assert(OFFSET_OF(GPUDispatchIndirectArgs, ThreadGroupCountY) == OFFSET_OF(VkDispatchIndirectCommand, y),"Wrong offset for GPUDrawIndirectArgs::ThreadGroupCountY");
static_assert(OFFSET_OF(GPUDispatchIndirectArgs, ThreadGroupCountY) == OFFSET_OF(VkDispatchIndirectCommand, y), "Wrong offset for GPUDrawIndirectArgs::ThreadGroupCountY");
static_assert(OFFSET_OF(GPUDispatchIndirectArgs, ThreadGroupCountZ) == OFFSET_OF(VkDispatchIndirectCommand, z), "Wrong offset for GPUDrawIndirectArgs::ThreadGroupCountZ");
//
static_assert(sizeof(GPUDrawIndirectArgs) == sizeof(VkDrawIndirectCommand), "Wrong size of GPUDrawIndirectArgs.");
static_assert(OFFSET_OF(GPUDrawIndirectArgs, VerticesCount) == OFFSET_OF(VkDrawIndirectCommand, vertexCount), "Wrong offset for GPUDrawIndirectArgs::VerticesCount");
static_assert(OFFSET_OF(GPUDrawIndirectArgs, InstanceCount) == OFFSET_OF(VkDrawIndirectCommand, instanceCount),"Wrong offset for GPUDrawIndirectArgs::InstanceCount");
static_assert(OFFSET_OF(GPUDrawIndirectArgs, InstanceCount) == OFFSET_OF(VkDrawIndirectCommand, instanceCount), "Wrong offset for GPUDrawIndirectArgs::InstanceCount");
static_assert(OFFSET_OF(GPUDrawIndirectArgs, StartVertex) == OFFSET_OF(VkDrawIndirectCommand, firstVertex), "Wrong offset for GPUDrawIndirectArgs::StartVertex");
static_assert(OFFSET_OF(GPUDrawIndirectArgs, StartInstance) == OFFSET_OF(VkDrawIndirectCommand, firstInstance), "Wrong offset for GPUDrawIndirectArgs::StartInstance");
//
static_assert(sizeof(GPUDrawIndexedIndirectArgs) == sizeof(VkDrawIndexedIndirectCommand), "Wrong size of GPUDrawIndexedIndirectArgs.");
static_assert(OFFSET_OF(GPUDrawIndexedIndirectArgs, IndicesCount) == OFFSET_OF(VkDrawIndexedIndirectCommand, indexCount), "Wrong offset for GPUDrawIndexedIndirectArgs::IndicesCount");
static_assert(OFFSET_OF(GPUDrawIndexedIndirectArgs, InstanceCount) == OFFSET_OF(VkDrawIndexedIndirectCommand, instanceCount),"Wrong offset for GPUDrawIndexedIndirectArgs::InstanceCount");
static_assert(OFFSET_OF(GPUDrawIndexedIndirectArgs, InstanceCount) == OFFSET_OF(VkDrawIndexedIndirectCommand, instanceCount), "Wrong offset for GPUDrawIndexedIndirectArgs::InstanceCount");
static_assert(OFFSET_OF(GPUDrawIndexedIndirectArgs, StartIndex) == OFFSET_OF(VkDrawIndexedIndirectCommand, firstIndex), "Wrong offset for GPUDrawIndexedIndirectArgs::StartIndex");
static_assert(OFFSET_OF(GPUDrawIndexedIndirectArgs, StartVertex) == OFFSET_OF(VkDrawIndexedIndirectCommand, vertexOffset), "Wrong offset for GPUDrawIndexedIndirectArgs::StartVertex");
static_assert(OFFSET_OF(GPUDrawIndexedIndirectArgs, StartInstance) == OFFSET_OF(VkDrawIndexedIndirectCommand, firstInstance), "Wrong offset for GPUDrawIndexedIndirectArgs::StartInstance");
@@ -337,7 +337,7 @@ DescriptorPoolVulkan* GPUContextVulkan::AllocateDescriptorSets(const VkDescripto
VkDescriptorSetAllocateInfo allocateInfo = descriptorSetAllocateInfo;
DescriptorPoolVulkan* pool = nullptr;
const uint32 hash = VULKAN_HASH_POOLS_WITH_TYPES_USAGE_ID ? layout.GetTypesUsageID() : GetHash(layout);
const uint32 hash = VULKAN_HASH_POOLS_WITH_TYPES_USAGE_ID ? layout.TypesUsageID : layout.Hash;
DescriptorPoolArray* typedDescriptorPools = _descriptorPools.TryGet(hash);
if (typedDescriptorPools != nullptr)

View File

@@ -41,7 +41,6 @@ class DescriptorSetLayoutVulkan;
struct PipelineBarrierVulkan
{
public:
VkPipelineStageFlags SourceStage = 0;
VkPipelineStageFlags DestStage = 0;
Array<VkImageMemoryBarrier, FixedAllocation<VK_BARRIER_BUFFER_SIZE>> ImageBarriers;
@@ -51,7 +50,6 @@ public:
#endif
public:
inline void Reset()
{
SourceStage = 0;
@@ -85,7 +83,6 @@ public:
class GPUContextVulkan : public GPUContext
{
private:
GPUDeviceVulkan* _device;
QueueVulkan* _queue;
CmdBufferManagerVulkan* _cmdBufferManager;
@@ -116,7 +113,6 @@ private:
Dictionary<uint32, DescriptorPoolArray> _descriptorPools;
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUContextVulkan"/> class.
/// </summary>
@@ -130,7 +126,6 @@ public:
~GPUContextVulkan();
public:
QueueVulkan* GetQueue() const
{
return _queue;
@@ -157,14 +152,12 @@ public:
void EndRenderPass();
private:
void UpdateDescriptorSets(const struct SpirvShaderDescriptorInfo& descriptorInfo, class DescriptorSetWriterVulkan& dsWriter, bool& needsWrite);
void UpdateDescriptorSets(GPUPipelineStateVulkan* pipelineState);
void UpdateDescriptorSets(ComputePipelineStateVulkan* pipelineState);
void OnDrawCall();
public:
// [GPUContext]
void FrameBegin() override;
void FrameEnd() override;

View File

@@ -250,23 +250,18 @@ void SetupDebugLayerCallback()
{
default:
createInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT;
// Fall-through...
case 4:
createInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT;
// Fall-through...
case 3:
createInfo.messageType |= VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
// Fall-through...
case 2:
createInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
createInfo.messageType |= VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
// Fall-through...
case 1:
createInfo.messageSeverity |= VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
createInfo.messageType |= VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT;
break;
case 0:
// Nothing to do
break;
}
const VkResult result = vkCreateDebugUtilsMessengerEXT(GPUDeviceVulkan::Instance, &createInfo, nullptr, &Messenger);
@@ -288,21 +283,16 @@ void SetupDebugLayerCallback()
{
default:
createInfo.flags |= VK_DEBUG_REPORT_DEBUG_BIT_EXT;
// Fall-through...
case 4:
createInfo.flags |= VK_DEBUG_REPORT_INFORMATION_BIT_EXT;
// Fall-through...
case 3:
createInfo.flags |= VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT;
// Fall-through...
case 2:
createInfo.flags |= VK_DEBUG_REPORT_WARNING_BIT_EXT;
// Fall-through...
case 1:
createInfo.flags |= VK_DEBUG_REPORT_ERROR_BIT_EXT;
break;
case 0:
// Nothing to do
break;
}
const VkResult result = vkCreateDebugReportCallbackEXT(GPUDeviceVulkan::Instance, &createInfo, nullptr, &MsgCallback);
@@ -354,14 +344,14 @@ DeferredDeletionQueueVulkan::~DeferredDeletionQueueVulkan()
ASSERT(_entries.IsEmpty());
}
void DeferredDeletionQueueVulkan::ReleaseResources(bool deleteImmediately)
void DeferredDeletionQueueVulkan::ReleaseResources(bool immediately)
{
const uint64 checkFrame = Engine::FrameCount - VULKAN_RESOURCE_DELETE_SAFE_FRAMES_COUNT;
ScopeLock lock(_locker);
for (int32 i = 0; i < _entries.Count(); i++)
{
Entry* e = &_entries.Get()[i];
if (deleteImmediately || (checkFrame > e->FrameNumber && (e->CmdBuffer == nullptr || e->FenceCounter < e->CmdBuffer->GetFenceSignaledCounter())))
if (immediately || (checkFrame > e->FrameNumber && (e->CmdBuffer == nullptr || e->FenceCounter < e->CmdBuffer->GetFenceSignaledCounter())))
{
if (e->AllocationHandle == VK_NULL_HANDLE)
{
@@ -2077,7 +2067,6 @@ GPUConstantBuffer* GPUDeviceVulkan::CreateConstantBuffer(uint32 size, const Stri
SemaphoreVulkan::SemaphoreVulkan(GPUDeviceVulkan* device)
: _device(device)
{
// Create semaphore
VkSemaphoreCreateInfo info;
RenderToolsVulkan::ZeroStruct(info, VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO);
VALIDATE_VULKAN_RESULT(vkCreateSemaphore(device->Device, &info, nullptr, &_semaphoreHandle));
@@ -2090,21 +2079,6 @@ SemaphoreVulkan::~SemaphoreVulkan()
_semaphoreHandle = VK_NULL_HANDLE;
}
FenceVulkan::~FenceVulkan()
{
ASSERT(_handle == VK_NULL_HANDLE);
}
FenceVulkan::FenceVulkan(GPUDeviceVulkan* device, FenceManagerVulkan* owner, bool createSignaled)
: _signaled(createSignaled)
, _owner(owner)
{
VkFenceCreateInfo info;
RenderToolsVulkan::ZeroStruct(info, VK_STRUCTURE_TYPE_FENCE_CREATE_INFO);
info.flags = createSignaled ? VK_FENCE_CREATE_SIGNALED_BIT : 0;
VALIDATE_VULKAN_RESULT(vkCreateFence(device->Device, &info, nullptr, &_handle));
}
FenceManagerVulkan::~FenceManagerVulkan()
{
ASSERT(_usedFences.IsEmpty());
@@ -2113,68 +2087,63 @@ FenceManagerVulkan::~FenceManagerVulkan()
void FenceManagerVulkan::Dispose()
{
ScopeLock lock(_device->_fenceLock);
ASSERT(_usedFences.IsEmpty());
for (FenceVulkan* fence : _freeFences)
{
DestroyFence(fence);
}
_freeFences.Clear();
}
FenceVulkan* FenceManagerVulkan::AllocateFence(bool createSignaled)
{
ScopeLock lock(_device->_fenceLock);
FenceVulkan* fence;
if (_freeFences.HasItems())
{
fence = _freeFences.Last();
_freeFences.RemoveLast();
_usedFences.Add(fence);
if (createSignaled)
{
fence->_signaled = true;
}
return fence;
fence->IsSignaled = true;
}
else
{
fence = New<FenceVulkan>();
fence->IsSignaled = createSignaled;
VkFenceCreateInfo info;
RenderToolsVulkan::ZeroStruct(info, VK_STRUCTURE_TYPE_FENCE_CREATE_INFO);
info.flags = createSignaled ? VK_FENCE_CREATE_SIGNALED_BIT : 0;
VALIDATE_VULKAN_RESULT(vkCreateFence(_device->Device, &info, nullptr, &fence->Handle));
_usedFences.Add(fence);
}
fence = New<FenceVulkan>(_device, this, createSignaled);
_usedFences.Add(fence);
return fence;
}
bool FenceManagerVulkan::WaitForFence(FenceVulkan* fence, uint64 timeInNanoseconds)
bool FenceManagerVulkan::WaitForFence(FenceVulkan* fence, uint64 timeInNanoseconds) const
{
ASSERT(_usedFences.Contains(fence));
ASSERT(!fence->_signaled);
const VkResult result = vkWaitForFences(_device->Device, 1, &fence->_handle, true, timeInNanoseconds);
ASSERT(!fence->IsSignaled);
const VkResult result = vkWaitForFences(_device->Device, 1, &fence->Handle, true, timeInNanoseconds);
LOG_VULKAN_RESULT(result);
if (result == VK_SUCCESS)
{
fence->_signaled = true;
fence->IsSignaled = true;
return false;
}
return true;
}
void FenceManagerVulkan::ResetFence(FenceVulkan* fence)
void FenceManagerVulkan::ResetFence(FenceVulkan* fence) const
{
if (fence->_signaled)
if (fence->IsSignaled)
{
VALIDATE_VULKAN_RESULT(vkResetFences(_device->Device, 1, &fence->_handle));
fence->_signaled = false;
VALIDATE_VULKAN_RESULT(vkResetFences(_device->Device, 1, &fence->Handle));
fence->IsSignaled = false;
}
}
void FenceManagerVulkan::ReleaseFence(FenceVulkan*& fence)
{
ScopeLock lock(_device->_fenceLock);
ResetFence(fence);
_usedFences.Remove(fence);
_freeFences.Add(fence);
@@ -2184,37 +2153,31 @@ void FenceManagerVulkan::ReleaseFence(FenceVulkan*& fence)
void FenceManagerVulkan::WaitAndReleaseFence(FenceVulkan*& fence, uint64 timeInNanoseconds)
{
ScopeLock lock(_device->_fenceLock);
if (!fence->IsSignaled())
{
if (!fence->IsSignaled)
WaitForFence(fence, timeInNanoseconds);
}
ResetFence(fence);
_usedFences.Remove(fence);
_freeFences.Add(fence);
fence = nullptr;
}
bool FenceManagerVulkan::CheckFenceState(FenceVulkan* fence)
bool FenceManagerVulkan::CheckFenceState(FenceVulkan* fence) const
{
ASSERT(_usedFences.Contains(fence));
ASSERT(!fence->_signaled);
const VkResult result = vkGetFenceStatus(_device->Device, fence->GetHandle());
ASSERT(!fence->IsSignaled);
const VkResult result = vkGetFenceStatus(_device->Device, fence->Handle);
if (result == VK_SUCCESS)
{
fence->_signaled = true;
fence->IsSignaled = true;
return true;
}
return false;
}
void FenceManagerVulkan::DestroyFence(FenceVulkan* fence)
void FenceManagerVulkan::DestroyFence(FenceVulkan* fence) const
{
vkDestroyFence(_device->Device, fence->GetHandle(), nullptr);
fence->_handle = VK_NULL_HANDLE;
vkDestroyFence(_device->Device, fence->Handle, nullptr);
fence->Handle = VK_NULL_HANDLE;
Delete(fence);
}

View File

@@ -18,7 +18,6 @@ class GPUAdapterVulkan;
class GPUSwapChainVulkan;
class CmdBufferVulkan;
class QueueVulkan;
class FenceVulkan;
class GPUTextureVulkan;
class GPUBufferVulkan;
class GPUTimerQueryVulkan;
@@ -31,12 +30,10 @@ class DescriptorPoolsManagerVulkan;
class SemaphoreVulkan
{
private:
GPUDeviceVulkan* _device;
VkSemaphore _semaphoreHandle;
public:
/// <summary>
/// Initializes a new instance of the <see cref="SemaphoreVulkan"/> class.
/// </summary>
@@ -58,59 +55,23 @@ public:
}
};
class FenceVulkan
struct FenceVulkan
{
friend FenceManagerVulkan;
private:
VkFence _handle;
bool _signaled;
FenceManagerVulkan* _owner;
public:
FenceVulkan(GPUDeviceVulkan* device, FenceManagerVulkan* owner, bool createSignaled);
~FenceVulkan();
public:
inline VkFence GetHandle() const
{
return _handle;
}
inline bool IsSignaled() const
{
return _signaled;
}
FenceManagerVulkan* GetOwner() const
{
return _owner;
}
VkFence Handle;
bool IsSignaled;
};
class FenceManagerVulkan
{
private:
GPUDeviceVulkan* _device;
GPUDeviceVulkan* _device = nullptr;
Array<FenceVulkan*> _freeFences;
Array<FenceVulkan*> _usedFences;
public:
FenceManagerVulkan()
: _device(nullptr)
{
}
~FenceManagerVulkan();
public:
/// <summary>
/// Initializes the specified device.
/// </summary>
/// <param name="device">The graphics device.</param>
void Init(GPUDeviceVulkan* device)
{
_device = device;
@@ -120,20 +81,15 @@ public:
FenceVulkan* AllocateFence(bool createSignaled = false);
inline bool IsFenceSignaled(FenceVulkan* fence)
FORCE_INLINE bool IsFenceSignaled(FenceVulkan* fence) const
{
if (fence->IsSignaled())
{
return true;
}
return CheckFenceState(fence);
return fence->IsSignaled || CheckFenceState(fence);
}
// Returns true if waiting timed out or failed, false otherwise.
bool WaitForFence(FenceVulkan* fence, uint64 timeInNanoseconds);
bool WaitForFence(FenceVulkan* fence, uint64 timeInNanoseconds) const;
void ResetFence(FenceVulkan* fence);
void ResetFence(FenceVulkan* fence) const;
// Sets the fence handle to null
void ReleaseFence(FenceVulkan*& fence);
@@ -142,17 +98,15 @@ public:
void WaitAndReleaseFence(FenceVulkan*& fence, uint64 timeInNanoseconds);
private:
// Returns true if fence was signaled, otherwise false.
bool CheckFenceState(FenceVulkan* fence);
bool CheckFenceState(FenceVulkan* fence) const;
void DestroyFence(FenceVulkan* fence);
void DestroyFence(FenceVulkan* fence) const;
};
class DeferredDeletionQueueVulkan
{
public:
enum Type
{
RenderPass,
@@ -172,7 +126,6 @@ public:
};
private:
struct Entry
{
uint64 FenceCounter;
@@ -188,7 +141,6 @@ private:
Array<Entry> _entries;
public:
/// <summary>
/// Initializes a new instance of the <see cref="DeferredDeletionQueueVulkan"/> class.
/// </summary>
@@ -201,7 +153,6 @@ public:
~DeferredDeletionQueueVulkan();
public:
template<typename T>
inline void EnqueueResource(Type type, T handle)
{
@@ -216,17 +167,15 @@ public:
EnqueueGenericResource(type, (uint64)handle, allocation);
}
void ReleaseResources(bool deleteImmediately = false);
void ReleaseResources(bool immediately = false);
private:
void EnqueueGenericResource(Type type, uint64 handle, VmaAllocation allocation);
};
class RenderTargetLayoutVulkan
{
public:
int32 RTsCount;
MSAALevel MSAA;
bool ReadDepth;
@@ -238,7 +187,6 @@ public:
uint32 Layers;
public:
bool operator==(const RenderTargetLayoutVulkan& other) const
{
return Platform::MemoryCompare(this, &other, sizeof(RenderTargetLayoutVulkan)) == 0;
@@ -250,7 +198,6 @@ uint32 GetHash(const RenderTargetLayoutVulkan& key);
class FramebufferVulkan
{
public:
struct Key
{
RenderPassVulkan* RenderPass;
@@ -258,7 +205,6 @@ public:
VkImageView Attachments[GPU_MAX_RT_BINDED + 1];
public:
bool operator==(const Key& other) const
{
return Platform::MemoryCompare(this, &other, sizeof(Key)) == 0;
@@ -266,23 +212,19 @@ public:
};
private:
GPUDeviceVulkan* _device;
VkFramebuffer _handle;
public:
FramebufferVulkan(GPUDeviceVulkan* device, Key& key, VkExtent2D& extent, uint32 layers);
~FramebufferVulkan();
public:
VkImageView Attachments[GPU_MAX_RT_BINDED + 1];
VkExtent2D Extent;
uint32 Layers;
public:
inline VkFramebuffer GetHandle()
{
return _handle;
@@ -296,21 +238,17 @@ uint32 GetHash(const FramebufferVulkan::Key& key);
class RenderPassVulkan
{
private:
GPUDeviceVulkan* _device;
VkRenderPass _handle;
public:
RenderTargetLayoutVulkan Layout;
public:
RenderPassVulkan(GPUDeviceVulkan* device, const RenderTargetLayoutVulkan& layout);
~RenderPassVulkan();
public:
inline VkRenderPass GetHandle() const
{
return _handle;
@@ -320,7 +258,6 @@ public:
class QueryPoolVulkan
{
protected:
struct Range
{
uint32 Start;
@@ -338,12 +275,10 @@ protected:
#endif
public:
QueryPoolVulkan(GPUDeviceVulkan* device, int32 capacity, VkQueryType type);
~QueryPoolVulkan();
public:
inline VkQueryPool GetHandle() const
{
return _handle;
@@ -357,7 +292,6 @@ public:
class BufferedQueryPoolVulkan : public QueryPoolVulkan
{
private:
Array<uint64> _queryOutput;
Array<uint64> _usedQueryBits;
Array<uint64> _startedQueryBits;
@@ -367,7 +301,6 @@ private:
int32 _lastBeginIndex;
public:
BufferedQueryPoolVulkan(GPUDeviceVulkan* device, int32 capacity, VkQueryType type);
bool AcquireQuery(uint32& resultIndex);
void ReleaseQuery(uint32 queryIndex);
@@ -382,7 +315,6 @@ public:
class HelperResourcesVulkan
{
private:
GPUDeviceVulkan* _device;
GPUTextureVulkan* _dummyTextures[6];
GPUBufferVulkan* _dummyBuffer;
@@ -390,11 +322,9 @@ private:
VkSampler _staticSamplers[GPU_STATIC_SAMPLERS_COUNT];
public:
HelperResourcesVulkan(GPUDeviceVulkan* device);
public:
VkSampler* GetStaticSamplers();
GPUTextureVulkan* GetDummyTexture(SpirvShaderResourceType type);
GPUBufferVulkan* GetDummyBuffer();
@@ -408,7 +338,6 @@ public:
class StagingManagerVulkan
{
private:
struct PendingEntry
{
GPUBuffer* Buffer;
@@ -435,7 +364,6 @@ private:
#endif
public:
StagingManagerVulkan(GPUDeviceVulkan* device);
GPUBuffer* AcquireBuffer(uint32 size, GPUResourceUsage usage);
void ReleaseBuffer(CmdBufferVulkan* cmdBuffer, GPUBuffer*& buffer);
@@ -453,7 +381,6 @@ class GPUDeviceVulkan : public GPUDevice
friend FenceManagerVulkan;
private:
CriticalSection _fenceLock;
mutable void* _nativePtr[2];
@@ -463,7 +390,6 @@ private:
// TODO: use mutex to protect those collections BUT use 2 pools per cache: one lock-free with lookup only and second protected with mutex synced on frame end!
public:
static GPUDevice* Create();
/// <summary>
@@ -479,7 +405,6 @@ public:
~GPUDeviceVulkan();
public:
struct OptionalVulkanDeviceExtensions
{
uint32 HasKHRMaintenance1 : 1;
@@ -497,7 +422,6 @@ public:
static OptionalVulkanDeviceExtensions OptionalDeviceExtensions;
public:
/// <summary>
/// The Vulkan instance.
/// </summary>
@@ -514,7 +438,6 @@ public:
static Array<const char*> InstanceLayers;
public:
/// <summary>
/// The main Vulkan commands context.
/// </summary>
@@ -652,7 +575,6 @@ public:
void OnImageViewDestroy(VkImageView imageView);
public:
/// <summary>
/// Setups the present queue to be ready for the given window surface.
/// </summary>
@@ -667,7 +589,7 @@ public:
/// <param name="optimalTiling">If set to <c>true</c> the optimal tiling should be used, otherwise use linear tiling.</param>
/// <returns>The output format.</returns>
PixelFormat GetClosestSupportedPixelFormat(PixelFormat format, GPUTextureFlags flags, bool optimalTiling);
/// <summary>
/// Saves the pipeline cache.
/// </summary>
@@ -683,11 +605,9 @@ public:
#endif
private:
bool IsVkFormatSupported(VkFormat vkFormat, VkFormatFeatureFlags wantedFeatureFlags, bool optimalTiling) const;
public:
// [GPUDevice]
GPUContext* GetMainContext() override;
GPUAdapter* GetAdapter() const override;
@@ -713,7 +633,6 @@ template<class BaseType>
class GPUResourceVulkan : public GPUResourceBase<GPUDeviceVulkan, BaseType>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUResourceVulkan"/> class.
/// </summary>
@@ -731,7 +650,6 @@ public:
class DescriptorOwnerResourceVulkan
{
public:
/// <summary>
/// Finalizes an instance of the <see cref="DescriptorOwnerResourceVulkan"/> class.
/// </summary>
@@ -740,7 +658,6 @@ public:
}
public:
/// <summary>
/// Gets the sampler descriptor.
/// </summary>

View File

@@ -73,7 +73,7 @@ ComputePipelineStateVulkan* GPUShaderProgramCSVulkan::GetOrCreateState()
_pipelineState = New<ComputePipelineStateVulkan>(_device, pipeline, layout);
_pipelineState->DescriptorInfo = &DescriptorInfo;
_pipelineState->DescriptorSetsLayout = &layout->GetDescriptorSetLayout();
_pipelineState->DescriptorSetHandles.AddZeroed(_pipelineState->DescriptorSetsLayout->GetHandles().Count());
_pipelineState->DescriptorSetHandles.AddZeroed(_pipelineState->DescriptorSetsLayout->Handles.Count());
uint32 dynamicOffsetsCount = 0;
if (DescriptorInfo.DescriptorTypesCount != 0)
{
@@ -136,9 +136,7 @@ PipelineLayoutVulkan* GPUPipelineStateVulkan::GetLayout()
#define INIT_SHADER_STAGE(set, bit) \
if (DescriptorInfoPerStage[DescriptorSet::set]) \
{ \
descriptorSetLayoutInfo.AddBindingsForStage(bit, DescriptorSet::set, DescriptorInfoPerStage[DescriptorSet::set]); \
}
descriptorSetLayoutInfo.AddBindingsForStage(bit, DescriptorSet::set, DescriptorInfoPerStage[DescriptorSet::set])
INIT_SHADER_STAGE(Vertex, VK_SHADER_STAGE_VERTEX_BIT);
INIT_SHADER_STAGE(Hull, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT);
INIT_SHADER_STAGE(Domain, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT);
@@ -149,7 +147,7 @@ PipelineLayoutVulkan* GPUPipelineStateVulkan::GetLayout()
_layout = _device->GetOrCreateLayout(descriptorSetLayoutInfo);
ASSERT(_layout);
DescriptorSetsLayout = &_layout->GetDescriptorSetLayout();
DescriptorSetHandles.AddZeroed(DescriptorSetsLayout->GetHandles().Count());
DescriptorSetHandles.AddZeroed(DescriptorSetsLayout->Handles.Count());
return _layout;
}

View File

@@ -14,28 +14,15 @@ class PipelineLayoutVulkan;
class ComputePipelineStateVulkan
{
private:
GPUDeviceVulkan* _device;
VkPipeline _handle;
PipelineLayoutVulkan* _layout;
public:
/// <summary>
/// Initializes a new instance of the <see cref="ComputePipelineStateVulkan"/> class.
/// </summary>
/// <param name="device">The graphics device.</param>
/// <param name="pipeline">The pipeline object.</param>
/// <param name="layout">The pipeline layout.</param>
ComputePipelineStateVulkan(GPUDeviceVulkan* device, VkPipeline pipeline, PipelineLayoutVulkan* layout);
/// <summary>
/// Finalizes an instance of the <see cref="GPUPipelineStateVulkan"/> class.
/// </summary>
~ComputePipelineStateVulkan();
public:
/// <summary>
/// The cached shader descriptor infos for compute shader.
/// </summary>
@@ -71,7 +58,6 @@ public:
Array<uint32> DynamicOffsets;
public:
void Bind(CmdBufferVulkan* cmdBuffer)
{
vkCmdBindDescriptorSets(
@@ -86,7 +72,6 @@ public:
}
public:
VkPipeline GetHandle() const
{
return _handle;
@@ -104,7 +89,6 @@ public:
class GPUPipelineStateVulkan : public GPUResourceVulkan<GPUPipelineState>
{
private:
Dictionary<RenderPassVulkan*, VkPipeline> _pipelines;
VkGraphicsPipelineCreateInfo _desc;
VkPipelineShaderStageCreateInfo _shaderStages[ShaderStage_Count - 1];
@@ -121,7 +105,6 @@ private:
PipelineLayoutVulkan* _layout;
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUPipelineStateVulkan"/> class.
/// </summary>
@@ -129,7 +112,6 @@ public:
GPUPipelineStateVulkan(GPUDeviceVulkan* device);
public:
/// <summary>
/// The bitmask of stages that exist in this pipeline.
/// </summary>
@@ -187,7 +169,6 @@ public:
Array<uint32> DynamicOffsets;
public:
void Bind(CmdBufferVulkan* cmdBuffer)
{
vkCmdBindDescriptorSets(
@@ -215,13 +196,11 @@ public:
VkPipeline GetState(RenderPassVulkan* renderPass);
public:
// [GPUPipelineState]
bool IsValid() const final override;
bool Init(const Description& desc) final override;
protected:
// [GPUResourceVulkan]
void OnReleaseGPU() override;
};

View File

@@ -13,7 +13,6 @@
class GPUSamplerVulkan : public GPUResourceVulkan<GPUSampler>
{
public:
GPUSamplerVulkan(GPUDeviceVulkan* device)
: GPUResourceVulkan<GPUSampler>(device, StringView::Empty)
{
@@ -22,7 +21,6 @@ public:
VkSampler Sampler = VK_NULL_HANDLE;
protected:
// [GPUSamplerVulkan]
bool OnInit() override;
void OnReleaseGPU() override;

View File

@@ -18,11 +18,9 @@ template<typename BaseType>
class GPUShaderProgramVulkan : public BaseType
{
protected:
GPUDeviceVulkan* _device;
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderProgramVulkan"/> class.
/// </summary>
@@ -50,7 +48,6 @@ public:
}
public:
/// <summary>
/// The Vulkan shader module.
/// </summary>
@@ -62,7 +59,6 @@ public:
SpirvShaderDescriptorInfo DescriptorInfo;
public:
// [BaseType]
uint32 GetBufferSize() const override
{
@@ -81,7 +77,6 @@ public:
class GPUShaderProgramVSVulkan : public GPUShaderProgramVulkan<GPUShaderProgramVS>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderProgramVSVulkan"/> class.
/// </summary>
@@ -95,13 +90,11 @@ public:
}
public:
VkPipelineVertexInputStateCreateInfo VertexInputState;
VkVertexInputBindingDescription VertexBindingDescriptions[VERTEX_SHADER_MAX_INPUT_ELEMENTS];
VkVertexInputAttributeDescription VertexAttributeDescriptions[VERTEX_SHADER_MAX_INPUT_ELEMENTS];
public:
// [GPUShaderProgramVulkan]
void* GetInputLayout() const override
{
@@ -120,7 +113,6 @@ public:
class GPUShaderProgramHSVulkan : public GPUShaderProgramVulkan<GPUShaderProgramHS>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderProgramHSVulkan"/> class.
/// </summary>
@@ -142,7 +134,6 @@ public:
class GPUShaderProgramDSVulkan : public GPUShaderProgramVulkan<GPUShaderProgramDS>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderProgramDSVulkan"/> class.
/// </summary>
@@ -162,7 +153,6 @@ public:
class GPUShaderProgramGSVulkan : public GPUShaderProgramVulkan<GPUShaderProgramGS>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderProgramGSVulkan"/> class.
/// </summary>
@@ -182,7 +172,6 @@ public:
class GPUShaderProgramPSVulkan : public GPUShaderProgramVulkan<GPUShaderProgramPS>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderProgramPSVulkan"/> class.
/// </summary>
@@ -202,11 +191,9 @@ public:
class GPUShaderProgramCSVulkan : public GPUShaderProgramVulkan<GPUShaderProgramCS>
{
private:
ComputePipelineStateVulkan* _pipelineState;
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderProgramCSVulkan"/> class.
/// </summary>
@@ -226,7 +213,6 @@ public:
~GPUShaderProgramCSVulkan();
public:
/// <summary>
/// Gets the state of the pipeline for the compute shader execution or creates a new one if missing.
/// </summary>

View File

@@ -17,7 +17,6 @@
class UniformBufferUploaderVulkan : public GPUResourceVulkan<GPUResource>, public ResourceOwnerVulkan
{
public:
struct Allocation
{
/// <summary>
@@ -42,7 +41,6 @@ public:
};
private:
VkBuffer _buffer;
VmaAllocation _allocation;
uint64 _size;
@@ -53,7 +51,6 @@ private:
uint64 _fenceCounter;
public:
/// <summary>
/// Initializes a new instance of the <see cref="UniformBufferUploaderVulkan"/> class.
/// </summary>
@@ -61,11 +58,9 @@ public:
UniformBufferUploaderVulkan(GPUDeviceVulkan* device);
public:
Allocation Allocate(uint64 size, uint32 alignment, GPUContextVulkan* context);
public:
// [GPUResourceVulkan]
GPUResourceType GetResourceType() const final override
{
@@ -79,7 +74,6 @@ public:
}
protected:
// [GPUResourceVulkan]
void OnReleaseGPU() override;
};
@@ -90,7 +84,6 @@ protected:
class GPUConstantBufferVulkan : public GPUResourceVulkan<GPUConstantBuffer>, public DescriptorOwnerResourceVulkan
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUConstantBufferVulkan"/> class.
/// </summary>
@@ -103,14 +96,12 @@ public:
}
public:
/// <summary>
/// The last uploaded data inside the shared uniforms uploading ring buffer.
/// </summary>
UniformBufferUploaderVulkan::Allocation Allocation;
public:
// [DescriptorOwnerResourceVulkan]
void DescriptorAsDynamicUniformBuffer(GPUContextVulkan* context, VkBuffer& buffer, VkDeviceSize& offset, VkDeviceSize& range, uint32& dynamicOffset) override
{
@@ -127,7 +118,6 @@ public:
class GPUShaderVulkan : public GPUResourceVulkan<GPUShader>
{
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUShaderVulkan"/> class.
/// </summary>
@@ -139,7 +129,6 @@ public:
}
protected:
// [GPUShader]
GPUShaderProgram* CreateGPUShaderProgram(ShaderStage type, const GPUShaderProgramInitializer& initializer, byte* cacheBytes, uint32 cacheSize, MemoryReadStream& stream) override;
};

View File

@@ -14,7 +14,6 @@
class BackBufferVulkan : public ResourceOwnerVulkan
{
public:
/// <summary>
/// The device.
/// </summary>
@@ -36,12 +35,10 @@ public:
GPUTextureViewVulkan Handle;
public:
void Setup(GPUSwapChainVulkan* window, VkImage backbuffer, PixelFormat format, VkExtent3D extent);
void Release();
public:
// [ResourceOwnerVulkan]
GPUResource* AsGPUResource() const override
{
@@ -58,7 +55,6 @@ class GPUSwapChainVulkan : public GPUResourceVulkan<GPUSwapChain>, public Resour
friend GPUDeviceVulkan;
private:
VkSurfaceKHR _surface;
VkSwapchainKHR _swapChain;
int32 _currentImageIndex;
@@ -68,11 +64,9 @@ private:
SemaphoreVulkan* _acquiredSemaphore;
public:
GPUSwapChainVulkan(GPUDeviceVulkan* device, Window* window);
public:
/// <summary>
/// Gets the Vulkan surface.
/// </summary>
@@ -92,7 +86,6 @@ public:
}
public:
enum class Status
{
Ok = 0,
@@ -108,12 +101,10 @@ public:
int32 AcquireNextImage(SemaphoreVulkan** outSemaphore);
private:
void ReleaseBackBuffer();
bool CreateSwapChain(int32 width, int32 height);
public:
// [GPUSwapChain]
bool IsFullscreen() override;
void SetFullscreen(bool isFullscreen) override;
@@ -129,7 +120,6 @@ public:
}
protected:
// [GPUResourceVulkan]
void OnReleaseGPU() override;
};

View File

@@ -15,7 +15,6 @@
class GPUTextureViewVulkan : public GPUTextureView, public DescriptorOwnerResourceVulkan
{
public:
GPUTextureViewVulkan()
{
}
@@ -44,7 +43,6 @@ public:
#endif
public:
GPUDeviceVulkan* Device = nullptr;
ResourceOwnerVulkan* Owner = nullptr;
VkImage Image = VK_NULL_HANDLE;
@@ -58,7 +56,6 @@ public:
VkImageLayout LayoutSRV;
public:
void Init(GPUDeviceVulkan* device, ResourceOwnerVulkan* owner, VkImage image, int32 totalMipLevels, PixelFormat format, MSAALevel msaa, VkExtent3D extent, VkImageViewType viewType, int32 mipLevels = 1, int32 firstMipIndex = 0, int32 arraySize = 1, int32 firstArraySlice = 0, bool readOnlyDepth = false);
VkImageView GetFramebufferView();
@@ -66,7 +63,6 @@ public:
void Release();
public:
// [GPUResourceView]
void* GetNativePtr() const override
{
@@ -84,7 +80,6 @@ public:
class GPUTextureVulkan : public GPUResourceVulkan<GPUTexture>, public ResourceOwnerVulkan, public DescriptorOwnerResourceVulkan
{
private:
VkImage _image = VK_NULL_HANDLE;
VmaAllocation _allocation = VK_NULL_HANDLE;
GPUTextureViewVulkan _handleArray;
@@ -95,7 +90,6 @@ private:
Array<Array<GPUTextureViewVulkan>> _handlesPerMip; // [slice][mip]
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUTextureVulkan"/> class.
/// </summary>
@@ -107,7 +101,6 @@ public:
}
public:
/// <summary>
/// Gets the Vulkan image handle.
/// </summary>
@@ -127,11 +120,9 @@ public:
VkImageAspectFlags DefaultAspectMask;
private:
void initHandles();
public:
// [GPUTexture]
GPUTextureView* View(int32 arrayOrDepthIndex) const override
{
@@ -178,7 +169,6 @@ public:
void DescriptorAsStorageImage(GPUContextVulkan* context, VkImageView& imageView, VkImageLayout& layout) override;
protected:
// [GPUTexture]
bool OnInit() override;
void OnResidentMipsChanged() override;

View File

@@ -13,7 +13,6 @@
class GPUTimerQueryVulkan : public GPUResourceVulkan<GPUTimerQuery>
{
private:
struct Query
{
BufferedQueryPoolVulkan* Pool;
@@ -35,7 +34,6 @@ private:
Array<QueryPair, InlinedAllocation<8>> _queries;
public:
/// <summary>
/// Initializes a new instance of the <see cref="GPUTimerQueryVulkan"/> class.
/// </summary>
@@ -43,7 +41,6 @@ public:
GPUTimerQueryVulkan(GPUDeviceVulkan* device);
public:
/// <summary>
/// Interrupts an in-progress query, allowing the command buffer to submitted. Interrupted queries must be resumed using Resume().
/// </summary>
@@ -57,14 +54,12 @@ public:
void Resume(CmdBufferVulkan* cmdBuffer);
private:
bool GetResult(Query& query);
void WriteTimestamp(CmdBufferVulkan* cmdBuffer, Query& query, VkPipelineStageFlagBits stage) const;
bool TryGetResult();
bool UseQueries();
public:
// [GPUTimerQuery]
void Begin() override;
void End() override;
@@ -72,7 +67,6 @@ public:
float GetResult() override;
protected:
// [GPUResourceVulkan]
void OnReleaseGPU() override;
};

View File

@@ -14,17 +14,16 @@ QueueVulkan::QueueVulkan(GPUDeviceVulkan* device, uint32 familyIndex)
, _device(device)
, _lastSubmittedCmdBuffer(nullptr)
, _lastSubmittedCmdBufferFenceCounter(0)
, _submitCounter(0)
{
vkGetDeviceQueue(device->Device, familyIndex, 0, &_queue);
}
void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 numSignalSemaphores, VkSemaphore* signalSemaphores)
void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 signalSemaphoresCount, const VkSemaphore* signalSemaphores)
{
ASSERT(cmdBuffer->HasEnded());
auto fence = cmdBuffer->GetFence();
ASSERT(!fence->IsSignaled());
ASSERT(!fence->IsSignaled);
const VkCommandBuffer cmdBuffers[] = { cmdBuffer->GetHandle() };
@@ -32,7 +31,7 @@ void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 numSignalSemaphores,
RenderToolsVulkan::ZeroStruct(submitInfo, VK_STRUCTURE_TYPE_SUBMIT_INFO);
submitInfo.commandBufferCount = 1;
submitInfo.pCommandBuffers = cmdBuffers;
submitInfo.signalSemaphoreCount = numSignalSemaphores;
submitInfo.signalSemaphoreCount = signalSemaphoresCount;
submitInfo.pSignalSemaphores = signalSemaphores;
Array<VkSemaphore, InlinedAllocation<8>> waitSemaphores;
@@ -48,7 +47,7 @@ void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 numSignalSemaphores,
submitInfo.pWaitDstStageMask = cmdBuffer->_waitFlags.Get();
}
VALIDATE_VULKAN_RESULT(vkQueueSubmit(_queue, 1, &submitInfo, fence->GetHandle()));
VALIDATE_VULKAN_RESULT(vkQueueSubmit(_queue, 1, &submitInfo, fence->Handle));
// Mark semaphores as submitted
cmdBuffer->_state = CmdBufferVulkan::State::Submitted;
@@ -78,21 +77,16 @@ void QueueVulkan::Submit(CmdBufferVulkan* cmdBuffer, uint32 numSignalSemaphores,
void QueueVulkan::GetLastSubmittedInfo(CmdBufferVulkan*& cmdBuffer, uint64& fenceCounter) const
{
_locker.Lock();
cmdBuffer = _lastSubmittedCmdBuffer;
fenceCounter = _lastSubmittedCmdBufferFenceCounter;
_locker.Unlock();
}
void QueueVulkan::UpdateLastSubmittedCommandBuffer(CmdBufferVulkan* cmdBuffer)
{
_locker.Lock();
_lastSubmittedCmdBuffer = cmdBuffer;
_lastSubmittedCmdBufferFenceCounter = cmdBuffer->GetFenceSignaledCounter();
_submitCounter++;
_locker.Unlock();
}

View File

@@ -17,7 +17,6 @@ class CmdBufferVulkan;
class QueueVulkan
{
private:
VkQueue _queue;
uint32 _familyIndex;
uint32 _queueIndex;
@@ -25,10 +24,8 @@ private:
CriticalSection _locker;
CmdBufferVulkan* _lastSubmittedCmdBuffer;
uint64 _lastSubmittedCmdBufferFenceCounter;
uint64 _submitCounter;
public:
QueueVulkan(GPUDeviceVulkan* device, uint32 familyIndex);
inline uint32 GetFamilyIndex() const
@@ -36,7 +33,7 @@ public:
return _familyIndex;
}
void Submit(CmdBufferVulkan* cmdBuffer, uint32 numSignalSemaphores = 0, VkSemaphore* signalSemaphores = nullptr);
void Submit(CmdBufferVulkan* cmdBuffer, uint32 signalSemaphoresCount = 0, const VkSemaphore* signalSemaphores = nullptr);
inline void Submit(CmdBufferVulkan* cmdBuffer, VkSemaphore signalSemaphore)
{
@@ -50,13 +47,7 @@ public:
void GetLastSubmittedInfo(CmdBufferVulkan*& cmdBuffer, uint64& fenceCounter) const;
inline uint64 GetSubmitCount() const
{
return _submitCounter;
}
private:
void UpdateLastSubmittedCommandBuffer(CmdBufferVulkan* cmdBuffer);
};

View File

@@ -6,6 +6,8 @@
#include "Engine/Core/Types/StringBuilder.h"
#include "Engine/Core/Log.h"
// @formatter:off
VkFormat RenderToolsVulkan::PixelFormatToVkFormat[108] =
{
VK_FORMAT_UNDEFINED,
@@ -163,6 +165,8 @@ VkCompareOp RenderToolsVulkan::ComparisonFuncToVkCompareOp[9] =
VK_COMPARE_OP_ALWAYS, // Always
};
// @formatter:on
#define VKERR(x) case x: sb.Append(TEXT(#x)); break
#if GPU_ENABLE_RESOURCE_NAMING

View File

@@ -34,14 +34,12 @@
class RenderToolsVulkan
{
private:
static VkFormat PixelFormatToVkFormat[static_cast<int32>(PixelFormat::MAX)];
static VkBlendFactor BlendToVkBlendFactor[static_cast<int32>(BlendingMode::Blend::MAX)];
static VkBlendOp OperationToVkBlendOp[static_cast<int32>(BlendingMode::Operation::MAX)];
static VkCompareOp ComparisonFuncToVkCompareOp[static_cast<int32>(ComparisonFunc::MAX)];
public:
#if GPU_ENABLE_RESOURCE_NAMING
static void SetObjectName(VkDevice device, uint64 objectHandle, VkObjectType objectType, const String& name);
static void SetObjectName(VkDevice device, uint64 objectHandle, VkObjectType objectType, const char* name);
@@ -80,13 +78,13 @@ public:
stageFlags = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
break;
#if VK_KHR_maintenance2
case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT:
case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT:
stageFlags = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
break;
case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT:
case VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT:
stageFlags = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
break;
#endif
default:
CRASH;
CRASH;
break;
}
return stageFlags;
@@ -130,17 +128,17 @@ public:
stageFlags = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
break;
#if VK_KHR_maintenance2
case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR:
accessFlags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
stageFlags = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
break;
case VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL_KHR:
accessFlags = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
stageFlags = VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT | VK_PIPELINE_STAGE_LATE_FRAGMENT_TESTS_BIT;
break;
#endif
case VK_IMAGE_LAYOUT_GENERAL:
accessFlags = VK_ACCESS_SHADER_READ_BIT | VK_ACCESS_SHADER_WRITE_BIT;
stageFlags = VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT;
break;
default:
CRASH;
CRASH;
break;
}
return stageFlags;
@@ -213,7 +211,7 @@ public:
result = VK_SAMPLER_MIPMAP_MODE_LINEAR;
break;
default:
CRASH;
CRASH;
break;
}
return result;
@@ -237,7 +235,7 @@ public:
result = VK_FILTER_LINEAR;
break;
default:
CRASH;
CRASH;
break;
}
return result;
@@ -261,7 +259,7 @@ public:
result = VK_FILTER_LINEAR;
break;
default:
CRASH;
CRASH;
break;
}
return result;
@@ -285,7 +283,7 @@ public:
result = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_BORDER;
break;
default:
CRASH;
CRASH;
break;
}
return result;
@@ -303,7 +301,7 @@ public:
result = VK_COMPARE_OP_NEVER;
break;
default:
CRASH;
CRASH;
break;
}
return result;

View File

@@ -30,13 +30,11 @@ class ResourceOwnerVulkan
friend GPUContextVulkan;
public:
virtual ~ResourceOwnerVulkan()
{
}
public:
/// <summary>
/// The resource state tracking helper. Used for resource barriers.
/// </summary>
@@ -48,7 +46,6 @@ public:
int32 ArraySlices;
public:
/// <summary>
/// Gets resource owner object as a GPUResource type or returns null if cannot perform cast.
/// </summary>
@@ -56,7 +53,6 @@ public:
virtual GPUResource* AsGPUResource() const = 0;
protected:
void initResource(VkImageLayout initialState, int32 mipLevels = 1, int32 arraySize = 1, bool usePerSubresourceTracking = false)
{
State.Initialize(mipLevels * arraySize, initialState, usePerSubresourceTracking);

View File

@@ -23,7 +23,6 @@ enum class VulkanValidationLevel
class VulkanPlatformBase
{
public:
static void GetInstanceExtensions(Array<const char*>& extensions, Array<const char*>& layers)
{
}