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 */