Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions Core/inc/EvoVulkan/Tools/VulkanTools.h
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,9 @@ namespace EvoVulkan::Tools {
EVK_MAYBE_UNUSED void DestroySynchronization(const VkDevice& device, Types::Synchronization* sync);
EVK_MAYBE_UNUSED Types::Synchronization CreateSynchronization(const VkDevice& device);

EVK_MAYBE_UNUSED VkFence CreateVulkanFence(const VkDevice& device, VkFenceCreateFlags flags);
EVK_MAYBE_UNUSED void DestroyVulkanFence(const VkDevice& device, VkFence* fence);

EVK_MAYBE_UNUSED VkSemaphore CreateVulkanSemaphore(const VkDevice& device);
EVK_MAYBE_UNUSED void DestroyVulkanSemaphore(const VkDevice& device, VkSemaphore* semaphore);

Expand Down
4 changes: 2 additions & 2 deletions Core/inc/EvoVulkan/Types/RenderPass.h
Original file line number Diff line number Diff line change
Expand Up @@ -395,10 +395,10 @@ namespace EvoVulkan::Types {
dependencies[0].pNext = nullptr;
dependencies[0].srcSubpass = VK_SUBPASS_EXTERNAL;
dependencies[0].dstSubpass = 0;
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
dependencies[0].srcStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[0].dstStageMask = VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT;
dependencies[0].srcAccessMask = 0;
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[0].dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
dependencies[0].dependencyFlags = VK_DEPENDENCY_BY_REGION_BIT;

dependencies[1].sType = VK_STRUCTURE_TYPE_SUBPASS_DEPENDENCY_2;
Expand Down
45 changes: 35 additions & 10 deletions Core/inc/EvoVulkan/VulkanKernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,19 +22,31 @@

namespace EvoVulkan::Core {
enum class FrameResult : uint8_t {
Error,
None,
Success,
OutOfDate,
Error,
Fatal,
DeviceLost,
OutOfDate,
Dirty,
Suboptimal
};

enum class RenderResult : uint8_t {
None, Success, Fatal, Error, DeviceLost
None,
Success,
Error,
Fatal,
DeviceLost
};

class DLL_EVK_EXPORT VulkanKernel : public Tools::NonCopyable {
protected:
struct FrameSync {
VkSemaphore imageAvailable; // signal: acquire
VkSemaphore renderFinished; // signal: submit
VkFence inFlightFence; // signal: submit done
};
protected:
VulkanKernel() = default;

Expand Down Expand Up @@ -89,14 +101,18 @@ namespace EvoVulkan::Core {
EVK_NODISCARD EVK_INLINE Types::RenderPass GetRenderPass() const noexcept { return m_renderPass; }
EVK_NODISCARD EVK_INLINE VkFramebuffer* GetFrameBuffers() { return m_frameBuffers.data(); }
EVK_NODISCARD EVK_INLINE bool IsMultisamplingEnabled() const noexcept { return m_sampleCount > 1; }
EVK_NODISCARD EVK_INLINE const std::vector<FrameSync>& GetFrameSyncs() const noexcept { return m_frames; }
EVK_NODISCARD EVK_INLINE const std::vector<VkFence>& GetInFlightFences() const noexcept { return m_imagesInFlight; }
//EVK_NODISCARD EVK_INLINE VkSemaphore GetPresentCompleteSemaphore() const noexcept { return m_syncs.m_presentComplete; }
//EVK_NODISCARD EVK_INLINE VkSemaphore GetRenderCompleteSemaphore() const noexcept { return m_syncs.m_renderComplete; }
EVK_NODISCARD std::vector<VkSemaphore>& GetWaitSemaphores() { return m_submitInfo.waitSemaphores; }

EVK_NODISCARD uint32_t GetCountComputeCmdBuffers() const { return m_countCCB; }
EVK_NODISCARD VkCommandBuffer* GetComputeCmdBuffers() const { return m_computeCmdBuffers; }
EVK_NODISCARD Types::CmdPool* GetComputeCmdPool() const { return m_computeCmdPool; }
EVK_NODISCARD Types::CmdPool* GetCurrentFrameCmdPool() const { return m_frameCmdPools[m_currentBuffer]; }
//EVK_NODISCARD Types::CmdPool* GetCurrentFrameCmdPool() const { return m_frameCmdPools[m_currentImage]; }
//EVK_NODISCARD Types::CmdPool* GetCurrentFrameCmdPool() const { return m_frameCmdPools[m_frameIndex]; }
EVK_NODISCARD Types::CmdPool* GetCurrentFrameCmdPool() const { return m_frameCmdPools[m_imageIndex]; }

EVK_NODISCARD uint8_t GetSampleCount() const;
EVK_NODISCARD EvoVulkan::Types::CmdBuffer* CreateSingleTimeCmd() const;
Expand All @@ -120,8 +136,10 @@ namespace EvoVulkan::Core {
EVK_NODISCARD const std::vector<SubmitInfo>& GetSubmitQueue() const { return m_submitQueue; };
EVK_NODISCARD uint16_t GetSwapchainImagesCount() const noexcept { return m_swapchainImages; }
EVK_NODISCARD uint16_t GetRequiredSwapchainImagesCount() const noexcept { return m_requiredSwapchainImages; }
EVK_NODISCARD uint8_t GetCurrentFrameIndex() const noexcept { return m_currentBuffer; }
EVK_NODISCARD uint8_t GetCurrentImageIndex() const noexcept { return m_currentImage; }
//EVK_NODISCARD uint8_t GetCurrentFrameIndex() const noexcept { return m_currentImage; }
EVK_NODISCARD uint8_t GetCurrentFrameIndex() const noexcept { return m_frameIndex; }
EVK_NODISCARD uint8_t GetMaxFramesInFlight() const noexcept;
EVK_NODISCARD uint8_t GetCurrentImageIndex() const noexcept { return m_imageIndex; }

void SetMultisampling(uint32_t sampleCount);
void SetSwapchainImagesCount(uint32_t count);
Expand All @@ -148,7 +166,8 @@ namespace EvoVulkan::Core {
bool DestroyDCBuffers();
bool ReCreateDCBuffers();
bool ReCreateFrameBuffers();
bool ReCreateSynchronizations();
void DestroySynchronizations(FrameResult reason);
bool ReCreateSynchronizations(FrameResult reason);
void DestroyFrameBuffers();

public:
Expand All @@ -165,6 +184,7 @@ namespace EvoVulkan::Core {
bool m_hasErrors = false;
bool m_paused = false;
bool m_dirty = false;
//bool m_imageAcquiredThisFrame = false;

int32_t m_newWidth = -1;
int32_t m_newHeight = -1;
Expand Down Expand Up @@ -194,11 +214,16 @@ namespace EvoVulkan::Core {
VkSemaphore m_offscreenSemaphore = VK_NULL_HANDLE;
SubmitInfo m_submitInfo = { };
SubmitInfo m_offscreenSubmitInfo = { };
std::vector<Types::Synchronization> m_frameSyncs = { };
//std::vector<Types::Synchronization> m_frameSyncs = { };

std::vector<FrameSync> m_frames; // size = MAX_FRAMES_IN_FLIGHT
std::vector<VkFence> m_imagesInFlight; // size = swapchainImageCount

std::vector<VkFence> m_waitFences = std::vector<VkFence>();
uint32_t m_currentBuffer = 0;
uint32_t m_currentImage = 0;
//uint32_t m_currentBuffer = 0;

uint32_t m_frameIndex = 0;
uint32_t m_imageIndex = 0;

std::vector<SubmitInfo> m_submitQueue = { };

Expand Down
18 changes: 18 additions & 0 deletions Core/src/EvoVulkan/Tools/VulkanTools.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,24 @@ namespace EvoVulkan::Tools {
return semaphore;
}

VkFence CreateVulkanFence(const VkDevice& device, VkFenceCreateFlags flags) {
VkFence fence = VK_NULL_HANDLE;
VkFenceCreateInfo fenceCreateInfo = Initializers::FenceCreateInfo(flags);
auto result = vkCreateFence(device, &fenceCreateInfo, nullptr, &fence);
if (result != VK_SUCCESS) {
VK_ERROR("Tools::CreateVulkanFence() : failed to create vulkan fence!");
return VK_NULL_HANDLE;
}
return fence;
}

void DestroyVulkanFence(const VkDevice& device, VkFence* fence) {
if (fence && *fence != VK_NULL_HANDLE) {
vkDestroyFence(device, *fence, nullptr);
*fence = VK_NULL_HANDLE;
}
}

void DestroyVulkanSemaphore(const VkDevice& device, VkSemaphore* semaphore) {
if (semaphore && *semaphore != VK_NULL_HANDLE) {
vkDestroySemaphore(device, *semaphore, nullptr);
Expand Down
Loading