From 506d3a1c3520c6466bb5be46bfd46de4f5ac7a28 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Mon, 12 Sep 2022 20:08:01 +0800 Subject: [PATCH] WIP --- SHADE_Engine/SHADE_Engine.vcxproj | 2 +- SHADE_Engine/SHADE_Engine.vcxproj.filters | 11 +- .../Editor/Backend/SHImGuiVulkanBackend.cpp | 334 +----------------- .../src/Editor/Backend/SHImGuiVulkanBackend.h | 3 + .../Graphics/Commands/SHVkCommandBuffer.cpp | 19 + .../src/Graphics/Commands/SHVkCommandBuffer.h | 9 +- .../Graphics/Devices/SHVkLogicalDevice.cpp | 7 +- .../src/Graphics/Devices/SHVkLogicalDevice.h | 25 +- .../src/Graphics/Images/SHVkImage.cpp | 30 +- SHADE_Engine/src/Graphics/Images/SHVkImage.h | 6 +- 10 files changed, 104 insertions(+), 342 deletions(-) diff --git a/SHADE_Engine/SHADE_Engine.vcxproj b/SHADE_Engine/SHADE_Engine.vcxproj index cd596fc6..c8dbf732 100644 --- a/SHADE_Engine/SHADE_Engine.vcxproj +++ b/SHADE_Engine/SHADE_Engine.vcxproj @@ -276,4 +276,4 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/SHADE_Engine/SHADE_Engine.vcxproj.filters b/SHADE_Engine/SHADE_Engine.vcxproj.filters index d890c070..1324473d 100644 --- a/SHADE_Engine/SHADE_Engine.vcxproj.filters +++ b/SHADE_Engine/SHADE_Engine.vcxproj.filters @@ -4,6 +4,9 @@ {8C1A20B0-78BC-4A86-6177-5EDA4DB8D1D6} + + {43EDC149-2FBB-B54F-184F-267604BC91B4} + {DBC7D3B0-C769-FE86-B024-12DB9C6585D7} @@ -111,6 +114,9 @@ + + Editor\Backend + Editor @@ -361,9 +367,11 @@ Tools - + + Editor\Backend + Editor @@ -542,6 +550,5 @@ Tools - \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.cpp b/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.cpp index 63fd39b8..29a8e703 100644 --- a/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.cpp +++ b/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.cpp @@ -235,6 +235,7 @@ namespace SHADE ImVec2 SHImGuiVulkanBackend::GetChildWindowPos(ImGuiViewport* viewport) noexcept { + return {}; } void SHImGuiVulkanBackend::SetChildWindowPos(ImGuiViewport* viewport, ImVec2 size) noexcept @@ -254,14 +255,14 @@ namespace SHADE { for (auto& primBuffer : primitiveBuffers) { - primBuffer.vertexBuffer = logicalDeviceHdl->CreateBuffer(sizeof(ImDrawVert) * 3000, + primBuffer.vertexBuffer = device->CreateBuffer(sizeof(ImDrawVert) * 3000, nullptr, sizeof(ImDrawVert) * 3000, vk::BufferUsageFlagBits::eVertexBuffer, VMA_MEMORY_USAGE_AUTO, VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT); // alloc flags - primBuffer.indicesBuffer = logicalDeviceHdl->CreateBuffer(sizeof(ImDrawIdx) * 3000, + primBuffer.indicesBuffer = device->CreateBuffer(sizeof(ImDrawIdx) * 3000, nullptr, sizeof(ImDrawIdx) * 3000, vk::BufferUsageFlagBits::eIndexBuffer, @@ -283,331 +284,28 @@ namespace SHADE // If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory. io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); + SHImageCreateParams createParams{}; + createParams.imageType = vk::ImageType::e2D; + createParams.width = width; + createParams.height = height; + createParams.depth = 1; + createParams.levels = 1; + createParams.arrayLayers = 1; + createParams.imageFormat = vk::Format::eR8G8B8A8Unorm; + createParams.usageFlags = vk::ImageUsageFlagBits::eSampled | vk::ImageUsageFlagBits::eTransferDst; + createParams.createFlags = {}; + fontsMipOffset.push_back(0); - // Create the texture in xgpu - { - std::array Mip{ height * width * sizeof(std::uint32_t) }; - xgpu::texture::setup Setup; - - Setup.m_Height = height; - Setup.m_Width = width; - Setup.m_MipChain = Mip; - Setup.m_Data = { reinterpret_cast(pixels), Mip[0].m_Size }; - - if (auto Err = m_Device.Create(Texture, Setup); Err) - return Err; - } + fontsTexture = device->CreateImage(createParams, pixels, width * height * sizeof(uint32_t), fontsMipOffset, VmaMemoryUsage::VMA_MEMORY_USAGE_AUTO, {}); // We could put here the texture id if we wanted io.Fonts->TexID = nullptr; - - return nullptr; - - } -} -#include -#include - -#include - -#include "SHImGuiVulkanBackend.h" - -#include - - -#include "Tools/SHLogger.h" -namespace SHADE -{ -#define GETINSTANCE \ - ImGuiIO& io = ImGui::GetIO(); \ - SHBreachInstance& instance = *reinterpret_cast(io.UserData); - - /* - #==============================================================# - || Embedded Shaders || - #==============================================================# - */ - // glsl_shader.vert, compiled with: - // # glslangValidator -V -x -o glsl_shader.vert.u32 glsl_shader.vert - /* - #version 450 core - layout(location = 0) in vec2 aPos; - layout(location = 1) in vec2 aUV; - layout(location = 2) in vec4 aColor; - layout(push_constant) uniform uPushConstant { vec2 uScale; vec2 uTranslate; } pc; - - out gl_PerVertex { vec4 gl_Position; }; - layout(location = 0) out struct { vec4 Color; vec2 UV; } Out; - - void main() - { - Out.Color = aColor; - Out.UV = aUV; - gl_Position = vec4(aPos * pc.uScale + pc.uTranslate, 0, 1); - } - */ - static uint32_t __glsl_shader_vert_spv[] = - { - 0x07230203,0x00010000,0x00080001,0x0000002e,0x00000000,0x00020011,0x00000001,0x0006000b, - 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, - 0x000a000f,0x00000000,0x00000004,0x6e69616d,0x00000000,0x0000000b,0x0000000f,0x00000015, - 0x0000001b,0x0000001c,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, - 0x00000000,0x00030005,0x00000009,0x00000000,0x00050006,0x00000009,0x00000000,0x6f6c6f43, - 0x00000072,0x00040006,0x00000009,0x00000001,0x00005655,0x00030005,0x0000000b,0x0074754f, - 0x00040005,0x0000000f,0x6c6f4361,0x0000726f,0x00030005,0x00000015,0x00565561,0x00060005, - 0x00000019,0x505f6c67,0x65567265,0x78657472,0x00000000,0x00060006,0x00000019,0x00000000, - 0x505f6c67,0x7469736f,0x006e6f69,0x00030005,0x0000001b,0x00000000,0x00040005,0x0000001c, - 0x736f5061,0x00000000,0x00060005,0x0000001e,0x73755075,0x6e6f4368,0x6e617473,0x00000074, - 0x00050006,0x0000001e,0x00000000,0x61635375,0x0000656c,0x00060006,0x0000001e,0x00000001, - 0x61725475,0x616c736e,0x00006574,0x00030005,0x00000020,0x00006370,0x00040047,0x0000000b, - 0x0000001e,0x00000000,0x00040047,0x0000000f,0x0000001e,0x00000002,0x00040047,0x00000015, - 0x0000001e,0x00000001,0x00050048,0x00000019,0x00000000,0x0000000b,0x00000000,0x00030047, - 0x00000019,0x00000002,0x00040047,0x0000001c,0x0000001e,0x00000000,0x00050048,0x0000001e, - 0x00000000,0x00000023,0x00000000,0x00050048,0x0000001e,0x00000001,0x00000023,0x00000008, - 0x00030047,0x0000001e,0x00000002,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002, - 0x00030016,0x00000006,0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040017, - 0x00000008,0x00000006,0x00000002,0x0004001e,0x00000009,0x00000007,0x00000008,0x00040020, - 0x0000000a,0x00000003,0x00000009,0x0004003b,0x0000000a,0x0000000b,0x00000003,0x00040015, - 0x0000000c,0x00000020,0x00000001,0x0004002b,0x0000000c,0x0000000d,0x00000000,0x00040020, - 0x0000000e,0x00000001,0x00000007,0x0004003b,0x0000000e,0x0000000f,0x00000001,0x00040020, - 0x00000011,0x00000003,0x00000007,0x0004002b,0x0000000c,0x00000013,0x00000001,0x00040020, - 0x00000014,0x00000001,0x00000008,0x0004003b,0x00000014,0x00000015,0x00000001,0x00040020, - 0x00000017,0x00000003,0x00000008,0x0003001e,0x00000019,0x00000007,0x00040020,0x0000001a, - 0x00000003,0x00000019,0x0004003b,0x0000001a,0x0000001b,0x00000003,0x0004003b,0x00000014, - 0x0000001c,0x00000001,0x0004001e,0x0000001e,0x00000008,0x00000008,0x00040020,0x0000001f, - 0x00000009,0x0000001e,0x0004003b,0x0000001f,0x00000020,0x00000009,0x00040020,0x00000021, - 0x00000009,0x00000008,0x0004002b,0x00000006,0x00000028,0x00000000,0x0004002b,0x00000006, - 0x00000029,0x3f800000,0x00050036,0x00000002,0x00000004,0x00000000,0x00000003,0x000200f8, - 0x00000005,0x0004003d,0x00000007,0x00000010,0x0000000f,0x00050041,0x00000011,0x00000012, - 0x0000000b,0x0000000d,0x0003003e,0x00000012,0x00000010,0x0004003d,0x00000008,0x00000016, - 0x00000015,0x00050041,0x00000017,0x00000018,0x0000000b,0x00000013,0x0003003e,0x00000018, - 0x00000016,0x0004003d,0x00000008,0x0000001d,0x0000001c,0x00050041,0x00000021,0x00000022, - 0x00000020,0x0000000d,0x0004003d,0x00000008,0x00000023,0x00000022,0x00050085,0x00000008, - 0x00000024,0x0000001d,0x00000023,0x00050041,0x00000021,0x00000025,0x00000020,0x00000013, - 0x0004003d,0x00000008,0x00000026,0x00000025,0x00050081,0x00000008,0x00000027,0x00000024, - 0x00000026,0x00050051,0x00000006,0x0000002a,0x00000027,0x00000000,0x00050051,0x00000006, - 0x0000002b,0x00000027,0x00000001,0x00070050,0x00000007,0x0000002c,0x0000002a,0x0000002b, - 0x00000028,0x00000029,0x00050041,0x00000011,0x0000002d,0x0000001b,0x0000000d,0x0003003e, - 0x0000002d,0x0000002c,0x000100fd,0x00010038 - }; - - // glsl_shader.frag, compiled with: - // # glslangValidator -V -x -o glsl_shader.frag.u32 glsl_shader.frag - /* - #version 450 core - layout(location = 0) out vec4 fColor; - layout(set=0, binding=0) uniform sampler2D sTexture; - layout(location = 0) in struct { vec4 Color; vec2 UV; } In; - void main() - { - fColor = In.Color * texture(sTexture, In.UV.st); - } - */ - static uint32_t __glsl_shader_frag_spv[] = - { - 0x07230203,0x00010000,0x00080001,0x0000001e,0x00000000,0x00020011,0x00000001,0x0006000b, - 0x00000001,0x4c534c47,0x6474732e,0x3035342e,0x00000000,0x0003000e,0x00000000,0x00000001, - 0x0007000f,0x00000004,0x00000004,0x6e69616d,0x00000000,0x00000009,0x0000000d,0x00030010, - 0x00000004,0x00000007,0x00030003,0x00000002,0x000001c2,0x00040005,0x00000004,0x6e69616d, - 0x00000000,0x00040005,0x00000009,0x6c6f4366,0x0000726f,0x00030005,0x0000000b,0x00000000, - 0x00050006,0x0000000b,0x00000000,0x6f6c6f43,0x00000072,0x00040006,0x0000000b,0x00000001, - 0x00005655,0x00030005,0x0000000d,0x00006e49,0x00050005,0x00000016,0x78655473,0x65727574, - 0x00000000,0x00040047,0x00000009,0x0000001e,0x00000000,0x00040047,0x0000000d,0x0000001e, - 0x00000000,0x00040047,0x00000016,0x00000022,0x00000000,0x00040047,0x00000016,0x00000021, - 0x00000000,0x00020013,0x00000002,0x00030021,0x00000003,0x00000002,0x00030016,0x00000006, - 0x00000020,0x00040017,0x00000007,0x00000006,0x00000004,0x00040020,0x00000008,0x00000003, - 0x00000007,0x0004003b,0x00000008,0x00000009,0x00000003,0x00040017,0x0000000a,0x00000006, - 0x00000002,0x0004001e,0x0000000b,0x00000007,0x0000000a,0x00040020,0x0000000c,0x00000001, - 0x0000000b,0x0004003b,0x0000000c,0x0000000d,0x00000001,0x00040015,0x0000000e,0x00000020, - 0x00000001,0x0004002b,0x0000000e,0x0000000f,0x00000000,0x00040020,0x00000010,0x00000001, - 0x00000007,0x00090019,0x00000013,0x00000006,0x00000001,0x00000000,0x00000000,0x00000000, - 0x00000001,0x00000000,0x0003001b,0x00000014,0x00000013,0x00040020,0x00000015,0x00000000, - 0x00000014,0x0004003b,0x00000015,0x00000016,0x00000000,0x0004002b,0x0000000e,0x00000018, - 0x00000001,0x00040020,0x00000019,0x00000001,0x0000000a,0x00050036,0x00000002,0x00000004, - 0x00000000,0x00000003,0x000200f8,0x00000005,0x00050041,0x00000010,0x00000011,0x0000000d, - 0x0000000f,0x0004003d,0x00000007,0x00000012,0x00000011,0x0004003d,0x00000014,0x00000017, - 0x00000016,0x00050041,0x00000019,0x0000001a,0x0000000d,0x00000018,0x0004003d,0x0000000a, - 0x0000001b,0x0000001a,0x00050057,0x00000007,0x0000001c,0x00000017,0x0000001b,0x00050085, - 0x00000007,0x0000001d,0x00000012,0x0000001c,0x0003003e,0x00000009,0x0000001d,0x000100fd, - 0x00010038 - }; - - /* - #==============================================================# - || ImGui Push Constants || - #==============================================================# - */ - struct ImGui_Push_Constants - { - std::array scale; - std::array translate; - }; - - void SHImGuiVulkanBackend::CreateInstance(Handle const& logicalDevice) noexcept - { - if (ImGui::GetCurrentContext() == nullptr) - { - IMGUI_CHECKVERSION(); - ImGui::CreateContext(); - } - else { SHLOG_WARNING("ImGui context already exists") }; - - ImGuiIO& io = ImGui::GetIO(); - io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls - io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // Enable Docking - io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable; // Enable Multi-Viewport / Platform Windows - io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset; // We can honor the ImDrawCmd::VtxOffset field, allowing for large meshes. - //io.BackendFlags |= ImGuiBackendFlags_RendererHasViewports; // We can create multi-viewports on the Renderer side (optional) - //io.BackendFlags |= ImGuiBackendFlags_PlatformHasViewports; // We can create multi-viewports on the Platform side (optional) - io.BackendRendererName = "SHImGuiVulkanBackend"; - - if (io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) - { - ImGuiPlatformIO& platformIO = ImGui::GetPlatformIO(); - platformIO.Renderer_CreateWindow = CreateChildWindow; - platformIO.Renderer_DestroyWindow = DestroyChildWindow; - platformIO.Renderer_SetWindowSize = SetChildWindowSize; - platformIO.Renderer_RenderWindow = RenderChildWindow; - platformIO.Renderer_SwapBuffers = ChildSwapBuffers; - - platformIO.Platform_CreateWindow = CreateChildWindow; - platformIO.Platform_DestroyWindow = DestroyChildWindow; - platformIO.Platform_ShowWindow = [](ImGuiViewport* pViewport) {}; - platformIO.Platform_SetWindowPos = SetChildWindowPos; - platformIO.Platform_GetWindowPos = GetChildWindowPos; - platformIO.Platform_SetWindowSize = SetChildWindowSize; - platformIO.Platform_GetWindowSize = GetChildWindowSize; - //platform_io.Platform_SetWindowFocus = ImGui_ImplGlfw_SetWindowFocus; - //platform_io.Platform_GetWindowFocus = ImGui_ImplGlfw_GetWindowFocus; - //platform_io.Platform_GetWindowMinimized = ImGui_ImplGlfw_GetWindowMinimized; - platformIO.Platform_SetWindowTitle = [](ImGuiViewport* pViewport, const char*) {}; - platformIO.Platform_RenderWindow = RenderChildWindow; - platformIO.Platform_SwapBuffers = ChildSwapBuffers; - - platformIO.Monitors.resize(0); - ImGuiPlatformMonitor monitor; - monitor.MainPos = monitor.WorkPos = {}; - monitor.MainSize = monitor.WorkSize = {}; - platformIO.Monitors.push_back(monitor); - }//if(io.ConfigFlags & ImGuiConfigFlags_ViewportsEnable) - - //associate io keymap with engine input keymap - - //Initialize instance - auto instance = std::make_unique(); - instance->InitializePipeline(io); - instance->lastFrameTime = std::chrono::high_resolution_clock::now(); - io.UserData = instance.release(); - - ImGuiViewport* viewport = ImGui::GetMainViewport(); - viewport->RendererUserData = io.UserData; - viewport->PlatformHandle = io.UserData; } - void SHImGuiVulkanBackend::Render(void) noexcept - { - ImGui::Render(); - ImDrawData* drawData = ImGui::GetDrawData(); - //TODO: instance draw data - } - - void SHImGuiVulkanBackend::CreateChildWindow(ImGuiViewport* viewport) noexcept - { - GETINSTANCE - - auto& info = *new SHImGuiWindow{ instance.device }; - viewport->RendererUserData = &info; - } - - void SHImGuiVulkanBackend::DestroyChildWindow(ImGuiViewport* viewport) noexcept - { - GETINSTANCE - - auto info = reinterpret_cast(viewport->RendererUserData); - delete info; - viewport->RendererUserData = nullptr; - } - - ImVec2 SHImGuiVulkanBackend::GetChildWindowSize(ImGuiViewport* viewport) noexcept - { - auto info = reinterpret_cast(viewport->RendererUserData); - return{}; - } - - void SHImGuiVulkanBackend::SetChildWindowSize(ImGuiViewport* viewport, ImVec2 size) noexcept + void SHImGuiVulkanBackend::SHBreachInstance::InitializePipeline(ImGuiIO& io) noexcept { } - ImVec2 SHImGuiVulkanBackend::GetChildWindowPos(ImGuiViewport* viewport) noexcept - { - } - - void SHImGuiVulkanBackend::SetChildWindowPos(ImGuiViewport* viewport, ImVec2 size) noexcept - { - } - - void SHImGuiVulkanBackend::RenderChildWindow(ImGuiViewport* viewport, void*) noexcept - { - } - - void SHImGuiVulkanBackend::ChildSwapBuffers(ImGuiViewport* viewport, void*) noexcept - { - } - - - void SHImGuiVulkanBackend::SHImGuiWindow::InitializeBuffers(void) noexcept - { - for (auto& primBuffer : primitiveBuffers) - { - primBuffer.vertexBuffer = logicalDeviceHdl->CreateBuffer(sizeof(ImDrawVert) * 3000, - nullptr, - sizeof(ImDrawVert) * 3000, - vk::BufferUsageFlagBits::eVertexBuffer, - VMA_MEMORY_USAGE_AUTO, - VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT); // alloc flags - - primBuffer.indicesBuffer = logicalDeviceHdl->CreateBuffer(sizeof(ImDrawIdx) * 3000, - nullptr, - sizeof(ImDrawIdx) * 3000, - vk::BufferUsageFlagBits::eIndexBuffer, - VMA_MEMORY_USAGE_AUTO, - VMA_ALLOCATION_CREATE_HOST_ACCESS_RANDOM_BIT | VMA_ALLOCATION_CREATE_MAPPED_BIT); // alloc flags - - } - } - - void SHImGuiVulkanBackend::SHBreachInstance::CreateFontsTexture(Handle image, ImGuiIO& io) noexcept - { - // Build texture atlas - unsigned char* pixels; - int width, height; - - // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. - // If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory. - io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); - - - - // Create the texture in xgpu - { - std::array Mip{ height * width * sizeof(std::uint32_t) }; - xgpu::texture::setup Setup; - - Setup.m_Height = height; - Setup.m_Width = width; - Setup.m_MipChain = Mip; - Setup.m_Data = { reinterpret_cast(pixels), Mip[0].m_Size }; - - if (auto Err = m_Device.Create(Texture, Setup); Err) - return Err; - } - - // We could put here the texture id if we wanted - io.Fonts->TexID = nullptr; - - return nullptr; - - } } \ No newline at end of file diff --git a/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.h b/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.h index df513df7..fdfa4160 100644 --- a/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.h +++ b/SHADE_Engine/src/Editor/Backend/SHImGuiVulkanBackend.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "Graphics/Buffers/SHVkBuffer.h" #include "Graphics/Images/SHVkImage.h" @@ -35,6 +36,8 @@ namespace SHADE { Handle pipeline; std::chrono::time_point lastFrameTime; + Handle fontsTexture; + std::vector fontsMipOffset; public: void CreateFontsTexture (Handle image, ImGuiIO& io) noexcept; void InitializePipeline(ImGuiIO& io) noexcept; diff --git a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp index a9753416..0cc9138e 100644 --- a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp +++ b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.cpp @@ -407,6 +407,25 @@ namespace SHADE } + void SHVkCommandBuffer::PipelineBarrier ( + vk::PipelineStageFlags srcStage, + vk::PipelineStageFlags dstStage, + vk::DependencyFlags deps, + std::vector const& memoryBarriers, + std::vector const& bufferMemoryBarriers, + std::vector const& imageMemoryBarriers + ) const noexcept + { + vkCommandBuffer.pipelineBarrier ( + srcStage, + dstStage, + deps, + memoryBarriers, + bufferMemoryBarriers, + imageMemoryBarriers + ); + } + //void SHVkCommandBuffer::PipelineBarrier(vk::PipelineStageFlags ) const noexcept //{ // //vkCommandBuffer.pipelineBarrier() diff --git a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h index 4f89f813..932a0d47 100644 --- a/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h +++ b/SHADE_Engine/src/Graphics/Commands/SHVkCommandBuffer.h @@ -115,7 +115,14 @@ namespace SHADE void DrawIndexed (uint32_t indexCount, uint32_t firstIndex, uint32_t vertexOffset) const noexcept; // memory barriers - //void PipelineBarrier (void) const noexcept; + void PipelineBarrier ( + vk::PipelineStageFlags srcStage, + vk::PipelineStageFlags dstStage, + vk::DependencyFlags deps, + std::vector const& memoryBarriers, + std::vector const& bufferMemoryBarriers, + std::vector const& imageMemoryBarriers + ) const noexcept; // Push Constant variable setting template diff --git a/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp b/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp index 0fa1c864..69e76246 100644 --- a/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp +++ b/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.cpp @@ -418,7 +418,12 @@ namespace SHADE /***************************************************************************/ Handle SHVkLogicalDevice::CreateImage(uint32_t w, uint32_t h, uint8_t levels, vk::Format format, vk::ImageUsageFlags usage, vk::ImageCreateFlags create) const noexcept { - return SHVkInstance::GetResourceManager().Create(std::cref(vmaAllocator), w, h, levels, format, usage, create); + return SHVkInstance::GetResourceManager().Create(&vmaAllocator, w, h, levels, format, usage, create); + } + + Handle SHVkLogicalDevice::CreateImage(SHImageCreateParams const& imageDetails, unsigned char* data, uint32_t dataSize, std::span inMipOffsets, VmaMemoryUsage memUsage, VmaAllocationCreateFlags allocFlags) noexcept + { + return SHVkInstance::GetResourceManager().Create(&vmaAllocator, imageDetails, data, dataSize, inMipOffsets, memUsage, allocFlags); } /***************************************************************************/ diff --git a/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.h b/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.h index 78108b94..d50d27f0 100644 --- a/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.h +++ b/SHADE_Engine/src/Graphics/Devices/SHVkLogicalDevice.h @@ -19,6 +19,7 @@ #include "vk_mem_alloc.h" #include "Graphics/Descriptors/SHVkDescriptorPool.h" #include "Graphics/Descriptors/SHVkDescriptorSetLayout.h" +#include "Graphics/Images/SHVkImage.h" namespace SHADE { @@ -29,7 +30,6 @@ namespace SHADE class SHVkSurface; class SHVkSwapchain; class SHVkBuffer; - class SHVkImage; class SHVkFence; class SHVkSemaphore; class SHVkShaderModule; @@ -138,14 +138,23 @@ namespace SHADE ) const noexcept; Handle CreateImage ( - uint32_t w, - uint32_t h, - uint8_t levels, - vk::Format format, - vk::ImageUsageFlags usage, - vk::ImageCreateFlags create + uint32_t w, + uint32_t h, + uint8_t levels, + vk::Format format, + vk::ImageUsageFlags usage, + vk::ImageCreateFlags create ) const noexcept; - + + Handle CreateImage ( + SHImageCreateParams const& imageDetails, + unsigned char* data, + uint32_t dataSize, + std::span inMipOffsets, + VmaMemoryUsage memUsage, + VmaAllocationCreateFlags allocFlags + ) noexcept; + Handle CreateShaderModule ( std::vector const& binaryData, std::string entryPoint, diff --git a/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp b/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp index 3cd311d3..f3d5a7b5 100644 --- a/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp +++ b/SHADE_Engine/src/Graphics/Images/SHVkImage.cpp @@ -103,11 +103,8 @@ namespace SHADE , randomAccessOptimized {false} , mappedPtr{nullptr} { - for (auto& bit : imageDetails.usageBits) - usageFlags |= bit; - - for (auto& bit : imageDetails.createBits) - createFlags |= bit; + usageFlags = imageDetails.usageFlags; + createFlags = imageDetails.createFlags; // If marked as 2D array compatible, image type MUST be 3D if (createFlags & vk::ImageCreateFlagBits::e2DArrayCompatible) @@ -257,9 +254,27 @@ namespace SHADE } - void SHVkImage::TransitionImage(vk::ImageLayout oldLayout, vk::ImageLayout newLayout) noexcept + /***************************************************************************/ + /*! + + \brief + Does not perform any image transitions but prepares a barrier for image + transitioning. Pipeline barrier will be issued outside this call after + this preparation function, or at least, it should be. + + \param oldLayout + Old layout of the image. + + \param newLayout + new layout of the image to transition to. + + \param barrier + Barrier to modify to prepare the image for transitioning. + + */ + /***************************************************************************/ + void SHVkImage::PrepareImageTransition(vk::ImageLayout oldLayout, vk::ImageLayout newLayout, vk::ImageMemoryBarrier& barrier) noexcept { - vk::ImageMemoryBarrier barrier{}; barrier.oldLayout = oldLayout; barrier.newLayout = newLayout; barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; @@ -297,7 +312,6 @@ namespace SHADE SHLOG_ERROR("Image layouts are invalid. "); } - //cmdBufferHdl } void SHVkImage::LinkWithExteriorImage(vk::Image inVkImage, vk::ImageType type, uint32_t inWidth, uint32_t inHeight, uint32_t inDepth, uint32_t layers, uint8_t levels, vk::Format format, vk::ImageUsageFlags flags) noexcept diff --git a/SHADE_Engine/src/Graphics/Images/SHVkImage.h b/SHADE_Engine/src/Graphics/Images/SHVkImage.h index 2884cd63..a30b90e6 100644 --- a/SHADE_Engine/src/Graphics/Images/SHVkImage.h +++ b/SHADE_Engine/src/Graphics/Images/SHVkImage.h @@ -36,10 +36,10 @@ namespace SHADE vk::Format imageFormat; //! Image usage bits - std::span usageBits; + vk::ImageUsageFlags usageFlags; //! Image create flags - std::span createBits; + vk::ImageCreateFlags createFlags; }; class SHVkImage @@ -136,7 +136,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ Handle CreateImageView (Handle const& inLogicalDeviceHdl, Handle const& parent, SHImageViewDetails const& createParams) const noexcept; void TransferToDeviceResource (Handle const& cmdBufferHdl) noexcept; - void TransitionImage (vk::ImageLayout oldLayout, vk::ImageLayout newLayout) noexcept; + void PrepareImageTransition (vk::ImageLayout oldLayout, vk::ImageLayout newLayout, vk::ImageMemoryBarrier& barrier) noexcept; /*-----------------------------------------------------------------------*/ /* GETTERS AND SETTERS */