diff --git a/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp b/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp index 028bf74f..a3b7b920 100644 --- a/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp +++ b/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp @@ -413,4 +413,9 @@ namespace SHADE return height; } + uint32_t SHVkImage::GetMipLevels(void) const noexcept + { + return mipLevelCount; + } + } diff --git a/SHADE_Engine/src/Graphics/Images/SHVkImage.h b/SHADE_Engine/src/Graphics/Images/SHVkImage.h index 8b6c042f..9d252150 100644 --- a/SHADE_Engine/src/Graphics/Images/SHVkImage.h +++ b/SHADE_Engine/src/Graphics/Images/SHVkImage.h @@ -150,6 +150,7 @@ namespace SHADE vk::Format GetImageFormat (void) const noexcept; uint32_t GetWidth (void) const noexcept; uint32_t GetHeight (void) const noexcept; + uint32_t GetMipLevels (void) const noexcept; }; } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 6b929a02..677d17c5 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -831,9 +831,17 @@ namespace SHADE return texLibrary.GetTextureHandle(textureId); } - Handle SHGraphicsSystem::AddFont(SHFontAsset const& fontAsset) const noexcept + /*---------------------------------------------------------------------------------*/ + /* Font Registration Functions */ + /*---------------------------------------------------------------------------------*/ + Handle SHGraphicsSystem::AddFont(SHFontAsset const& fontAsset) noexcept { - + return fontLibrary.AddFont(device, resourceManager, fontAsset); + } + + void SHGraphicsSystem::BuildFonts(void) noexcept + { + fontLibrary.BuildFonts(device, graphicsQueue, graphicsCmdPool, descPool, resourceManager); } #pragma endregion ADD_REMOVE diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index da9870bc..a5c39831 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -336,7 +336,8 @@ namespace SHADE */ /***************************************************************************/ - Handle AddFont (SHFontAsset const& fontAsset) const noexcept; + Handle AddFont (SHFontAsset const& fontAsset) noexcept; + void BuildFonts (void) noexcept; void PrepareResize(uint32_t newWidth, uint32_t newHeight) noexcept; void HandleResize(void) noexcept; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.cpp index ccead721..2812aef4 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.cpp @@ -22,7 +22,7 @@ namespace SHADE */ /***************************************************************************/ - SHFont::SHFont(Handle inLogicalDeviceHdl, SHFontAsset& asset) noexcept + SHFont::SHFont(Handle inLogicalDeviceHdl, SHFontAsset const& asset) noexcept { /*-----------------------------------------------------------------------*/ /* PREPARE GPU DATA */ @@ -88,8 +88,6 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* COMMANDS TO TRANSFER TO DEVICE MEMORY */ /*-----------------------------------------------------------------------*/ - - // Transfer to device memory bitmapDataImage->TransferToDeviceResource(commandBuffer); @@ -151,4 +149,9 @@ namespace SHADE return bitmapDataImage; } + Handle SHFont::GetMatrixBuffer(void) const noexcept + { + return matrixDataBuffer; + } + } \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.h b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.h index 657520cc..d529dec2 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFont.h @@ -50,7 +50,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* PUBLIC MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ - SHFont (Handle inLogicalDeviceHdl, SHFontAsset& asset) noexcept; + SHFont (Handle inLogicalDeviceHdl, SHFontAsset const& asset) noexcept; void TransferToGPU (Handle commandBuffer) noexcept; void DoPostTransfer (Handle descPool) noexcept; @@ -61,6 +61,7 @@ namespace SHADE std::unordered_map GetUnicodeIndexing (void) const noexcept; SHFontAsset const& GetFontAsset (void) const noexcept; Handle GetImage (void) const noexcept; + Handle GetMatrixBuffer (void) const noexcept; }; } diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.cpp index 86009ff1..1316851c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.cpp @@ -2,6 +2,9 @@ #include "SHFontLibrary.h" #include "Graphics/Images/SHVkImage.h" #include "Graphics/Commands/SHVkCommandPool.h" +#include "Graphics/Devices/SHVkLogicalDevice.h" +#include "Graphics/Synchronization/SHVkFence.h" +#include "Graphics/Buffers/SHVkBuffer.h" namespace SHADE { @@ -26,6 +29,10 @@ namespace SHADE postTransferBarriers.emplace_back(); newFont->GetImage()->PrepareImageTransitionInfo(vk::ImageLayout::eUndefined, vk::ImageLayout::eTransferDstOptimal, preTransferBarriers[preTransferBarriers.size() - 1]); newFont->GetImage()->PrepareImageTransitionInfo(vk::ImageLayout::eTransferDstOptimal, vk::ImageLayout::eShaderReadOnlyOptimal, postTransferBarriers[postTransferBarriers.size() - 1]); + + unpreparedFonts.emplace_back (newFont); + + return newFont; } /***************************************************************************/ @@ -43,30 +50,54 @@ namespace SHADE */ /***************************************************************************/ - void SHFontLibrary::BuildFonts(Handle cmdPool, Handle descPool, SHResourceHub& resourceHub) noexcept + void SHFontLibrary::BuildFonts(Handle logicalDevice, Handle queue, Handle cmdPool, Handle descPool, SHResourceHub& resourceHub) noexcept { - //std::vector + // create fence to wait on after transfer + Handle finishCopyFence = resourceHub.Create(logicalDevice); + // allocate new command buffer Handle transferCommandBuffer = cmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY); // Begin recording transfer ops transferCommandBuffer->BeginRecording(); + { + // Transition image to dst + transferCommandBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, {}, {}, preTransferBarriers); - // Transition image to dst - transferCommandBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eTopOfPipe, vk::PipelineStageFlagBits::eTransfer, {}, {}, {}, preTransferBarriers); - - - - // Transition dst to shader read - transferCommandBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eFragmentShader, {}, {}, {}, postTransferBarriers); + // Transfer data from staging to image + for (auto& font : unpreparedFonts) + font->TransferToGPU(transferCommandBuffer); + // Transition dst to shader read + transferCommandBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eTransfer, vk::PipelineStageFlagBits::eFragmentShader, {}, {}, {}, postTransferBarriers); + } // End recording for transfer ops transferCommandBuffer->EndRecording(); - // Free it + // Submit command buffer to queue + queue->SubmitCommandBuffer({transferCommandBuffer}, {}, {}, vk::PipelineStageFlagBits::eTransfer, finishCopyFence); + + // wait for copy to finish + finishCopyFence->Wait(true, std::numeric_limits::max()); + + // Prepare image views and desc sets + for (auto& font : unpreparedFonts) + font->DoPostTransfer(descPool); + + // Free the command buffer and fence resourceHub.Free(transferCommandBuffer); + resourceHub.Free(finishCopyFence); + + // Once unprepared fonts are now ready for use, push them into container + uint32_t i = static_cast (unpreparedFonts.size()); + std::copy (unpreparedFonts.begin(), unpreparedFonts.end(), std::back_inserter(fonts)); + + // All fonts have been prepared for GPU usage + unpreparedFonts.clear(); + preTransferBarriers.clear(); + postTransferBarriers.clear(); } } \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.h b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.h index 74f2ca1a..cfb1cd63 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHFontLibrary.h @@ -18,8 +18,8 @@ namespace SHADE //! Handles to all the fonts usable in SHTextRendererComponents std::vector> fonts; - //! for indexing - std::unordered_map>().GetId().Raw), uint32_t> fontIndexing; + //! Fonts that have yet to be properly prepared for usage + std::vector> unpreparedFonts; //! For transitioning images for transfer operations std::vector preTransferBarriers; @@ -29,6 +29,6 @@ namespace SHADE public: Handle AddFont (Handle logicalDevice, SHResourceHub& resourceHub, SHFontAsset const& asset) noexcept; - void BuildFonts (Handle cmdPool, Handle descPool, SHResourceHub& resourceHub) noexcept; + void BuildFonts (Handle logicalDevice, Handle queue, Handle cmdPool, Handle descPool, SHResourceHub& resourceHub) noexcept; }; } diff --git a/SHADE_Engine/src/Resource/SHResourceManager.cpp b/SHADE_Engine/src/Resource/SHResourceManager.cpp index dad9fd9f..a5de9064 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.cpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.cpp @@ -25,7 +25,8 @@ namespace SHADE std::unordered_map> SHResourceManager::typedFreeFuncMap; std::vector SHResourceManager::loadedAssetData; bool SHResourceManager::textureChanged = false; - bool SHResourceManager::meshChanged = false; + bool SHResourceManager::meshChanged = false; + bool SHResourceManager::fontChanged = false; /*-----------------------------------------------------------------------------------*/ /* Function Definitions */ @@ -76,6 +77,11 @@ namespace SHADE gfxSystem->BuildTextures(); textureChanged = false; } + if (fontChanged) + { + gfxSystem->BuildFonts(); + fontChanged = false; + } // Free CPU Resources for (auto assetId : loadedAssetData) diff --git a/SHADE_Engine/src/Resource/SHResourceManager.h b/SHADE_Engine/src/Resource/SHResourceManager.h index 57f2b205..c141c176 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.h +++ b/SHADE_Engine/src/Resource/SHResourceManager.h @@ -139,6 +139,7 @@ namespace SHADE // Dirty Flags static bool meshChanged; static bool textureChanged; + static bool fontChanged; /*---------------------------------------------------------------------------------*/ /* Helper Functions */ diff --git a/SHADE_Engine/src/Resource/SHResourceManager.hpp b/SHADE_Engine/src/Resource/SHResourceManager.hpp index 070167b8..5f3be729 100644 --- a/SHADE_Engine/src/Resource/SHResourceManager.hpp +++ b/SHADE_Engine/src/Resource/SHResourceManager.hpp @@ -318,7 +318,10 @@ namespace SHADE } else if constexpr (std::is_same_v) { - + loadedAssetData.emplace_back(assetId); + textureChanged = true; + + return gfxSystem->AddFont(assetData); } } }