diff --git a/Resources/Shaders/imgui.frag b/Resources/Shaders/imgui.frag index 7185a2cf..1d95a80e 100644 --- a/Resources/Shaders/imgui.frag +++ b/Resources/Shaders/imgui.frag @@ -1,12 +1,22 @@ #version 460 core +#extension GL_EXT_nonuniform_qualifier : require +#extension GL_EXT_shader_explicit_arithmetic_types_int64 : enable + layout(location = 0) out vec4 fColor; -layout(set = 0, binding = 0) uniform sampler2D sTexture; +layout(set = 0, binding = 0) uniform sampler2D TextureArray[]; + layout(location = 0) in struct { vec4 Color; - vec2 UV; + vec4 TexData; } In; + void main() { - fColor = In.Color * texture(sTexture, In.UV.st); + uint texId = uint(In.TexData.z); + if (texId < 0xFFFFFFFFu) + { + vec4 texVal = texture(TextureArray[nonuniformEXT(texId)], In.TexData.xy); + fColor = In.Color * texVal; + } } \ No newline at end of file diff --git a/Resources/Shaders/imgui.vert b/Resources/Shaders/imgui.vert index 4b7b49f5..d5fa11a8 100644 --- a/Resources/Shaders/imgui.vert +++ b/Resources/Shaders/imgui.vert @@ -2,26 +2,24 @@ 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; + uint index; } pc; -out gl_PerVertex -{ - vec4 gl_Position; -}; layout(location = 0) out struct { vec4 Color; - vec2 UV; + vec4 TexData; } Out; void main() { Out.Color = aColor; - Out.UV = aUV; + Out.TexData = vec4(aUV, pc.index, 0.0); gl_Position = vec4(aPos * pc.uScale + pc.uTranslate, 0, 1); } \ No newline at end of file diff --git a/Tetragrama/Components/ProjectViewUIComponent.cpp b/Tetragrama/Components/ProjectViewUIComponent.cpp index c65fef0e..cab54765 100644 --- a/Tetragrama/Components/ProjectViewUIComponent.cpp +++ b/Tetragrama/Components/ProjectViewUIComponent.cpp @@ -23,8 +23,12 @@ namespace Tetragrama::Components { if (!m_textures_loaded) { - m_directory_icon = renderer->AsyncLoader->LoadTextureFileSync("Settings/Icons/DirectoryIcon.png"); - m_file_icon = renderer->AsyncLoader->LoadTextureFileSync("Settings/Icons/FileIcon.png"); + m_directory_icon = renderer->AsyncLoader->LoadTextureFileSync("Settings/Icons/DirectoryIcon.png"); + m_file_icon = renderer->AsyncLoader->LoadTextureFileSync("Settings/Icons/FileIcon.png"); + + renderer->Device->TextureHandleToUpdates.Enqueue(m_directory_icon); + renderer->Device->TextureHandleToUpdates.Enqueue(m_file_icon); + m_textures_loaded = true; } @@ -99,7 +103,7 @@ namespace Tetragrama::Components ImGui::PushID(name.c_str()); - ImTextureID icon = entry.is_directory() ? static_cast(renderer->ImguiRenderer->UpdateDirIconOutput(m_directory_icon)) : static_cast(renderer->ImguiRenderer->UpdateFileIconOutput(m_file_icon)); + ImTextureID icon = entry.is_directory() ? (ImTextureID) m_directory_icon.Index : (ImTextureID) m_file_icon.Index; const float margin = 5.0f; ImVec2 cursorPos = ImGui::GetCursorPos(); diff --git a/Tetragrama/Components/SceneViewportUIComponent.cpp b/Tetragrama/Components/SceneViewportUIComponent.cpp index 9a451cbf..e5cabc25 100644 --- a/Tetragrama/Components/SceneViewportUIComponent.cpp +++ b/Tetragrama/Components/SceneViewportUIComponent.cpp @@ -89,11 +89,11 @@ namespace Tetragrama::Components // Scene texture representation if (!m_scene_texture || m_refresh_texture_handle) { - m_scene_texture = renderer->GetImguiFrameOutput(); + m_scene_texture = renderer->GetFrameOutput(); m_refresh_texture_handle = false; } - ImGui::Image(m_scene_texture, m_viewport_size, ImVec2(0, 1), ImVec2(1, 0)); + ImGui::Image((ImTextureID) m_scene_texture.Index, m_viewport_size, ImVec2(0, 1), ImVec2(1, 0)); // ViewPort bound computation ImVec2 viewport_windows_size = ImGui::GetWindowSize(); ImVec2 minimum_bound = ImGui::GetWindowPos(); diff --git a/Tetragrama/Components/SceneViewportUIComponent.h b/Tetragrama/Components/SceneViewportUIComponent.h index 17dbf601..00a97640 100644 --- a/Tetragrama/Components/SceneViewportUIComponent.h +++ b/Tetragrama/Components/SceneViewportUIComponent.h @@ -24,17 +24,17 @@ namespace Tetragrama::Components // std::future SceneViewportUnfocusedMessageHandlerAsync(Messengers::GenericMessage&); private: - bool m_is_window_focused{false}; - bool m_is_window_hovered{false}; - bool m_is_window_clicked{false}; - bool m_refresh_texture_handle{false}; - bool m_request_renderer_resize{false}; - bool m_is_resizing{false}; - int m_idle_frame_count = 0; - int m_idle_frame_threshold = 9; // SwapchainImageCount * 3 - ImVec2 m_viewport_size{0.f, 0.f}; - ImVec2 m_content_region_available_size{0.f, 0.f}; - std::array m_viewport_bounds; - VkDescriptorSet m_scene_texture{VK_NULL_HANDLE}; + bool m_is_window_focused{false}; + bool m_is_window_hovered{false}; + bool m_is_window_clicked{false}; + bool m_refresh_texture_handle{false}; + bool m_request_renderer_resize{false}; + bool m_is_resizing{false}; + int m_idle_frame_count = 0; + int m_idle_frame_threshold = 9; // SwapchainImageCount * 3 + ImVec2 m_viewport_size{0.f, 0.f}; + ImVec2 m_content_region_available_size{0.f, 0.f}; + std::array m_viewport_bounds; + ZEngine::Rendering::Textures::TextureHandle m_scene_texture{}; }; } // namespace Tetragrama::Components diff --git a/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.cpp b/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.cpp index ad0dc242..b78c225d 100644 --- a/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.cpp +++ b/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.cpp @@ -57,6 +57,8 @@ namespace ZEngine::Rendering::Renderers FrameColorRenderTarget = Device->GlobalTextures->Add(CreateTexture({.PerformTransition = false, .Width = 1280, .Height = 780, .Format = ImageFormat::R8G8B8A8_UNORM})); FrameDepthRenderTarget = Device->GlobalTextures->Add(CreateTexture({.PerformTransition = false, .Width = 1280, .Height = 780, .Format = ImageFormat::DEPTH_STENCIL_FROM_DEVICE})); + + Device->TextureHandleToUpdates.Enqueue(FrameColorRenderTarget); /* * Subsystems initialization */ @@ -114,10 +116,9 @@ namespace ZEngine::Rendering::Renderers RenderGraph->Execute(frame_index, command_buffer, scene); } - VkDescriptorSet GraphicRenderer::GetImguiFrameOutput() + Textures::TextureHandle GraphicRenderer::GetFrameOutput() { - auto rt_handle = RenderGraph->GetRenderTarget(FrameColorRenderTargetName); - return ImguiRenderer->UpdateFrameOutput(rt_handle); + return RenderGraph->GetRenderTarget(FrameColorRenderTargetName); } Helpers::Ref GraphicRenderer::CreateRenderPass(const Specifications::RenderPassSpecification& spec) diff --git a/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.h b/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.h index 963e9470..3759f857 100644 --- a/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.h +++ b/ZEngine/ZEngine/Rendering/Renderers/GraphicRenderer.h @@ -59,7 +59,7 @@ namespace ZEngine::Rendering::Renderers void Deinitialize(); void Update(); void DrawScene(Hardwares::CommandBuffer* const command_buffer, Cameras::Camera* const camera, Scenes::SceneRawData* const scene); - VkDescriptorSet GetImguiFrameOutput(); + Textures::TextureHandle GetFrameOutput(); Helpers::Ref CreateRenderPass(const Specifications::RenderPassSpecification& spec); Helpers::Ref CreateTexture(const Specifications::TextureSpecification& spec); diff --git a/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.cpp b/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.cpp index 3efa338c..ada34c73 100644 --- a/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.cpp +++ b/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.cpp @@ -48,10 +48,7 @@ namespace ZEngine::Rendering::Renderers style.ChildBorderSize = 0.f; style.FrameRounding = 7.0f; - auto window_property = current_window->GetWindowProperty(); - io.Fonts->AddFontFromFileTTF("Settings/Fonts/OpenSans/OpenSans-Bold.ttf", 17.f * window_property.DpiScale); - io.FontDefault = io.Fonts->AddFontFromFileTTF("Settings/Fonts/OpenSans/OpenSans-Regular.ttf", 17.f * window_property.DpiScale); - io.FontGlobalScale = window_property.DpiScale; + io.FontDefault = io.Fonts->AddFontFromFileTTF("Settings/Fonts/OpenSans/OpenSans-Regular.ttf", 17.f); ImGui_ImplGlfw_InitForVulkan(reinterpret_cast(current_window->GetNativeWindow()), false); @@ -81,73 +78,44 @@ namespace ZEngine::Rendering::Renderers .UseShader("imgui") .SetShaderOverloadMaxSet(2000) - .SetOverloadPoolSize(4) .UseSwapchainAsRenderTarget(); m_ui_pass = renderer->CreateRenderPass(builder->Detach()); + m_ui_pass->SetBindlessInput("TextureArray"); m_ui_pass->Verify(); m_ui_pass->Bake(); - - auto shader = m_ui_pass->Pipeline->GetShader(); - auto descriptor_setlayout = shader->GetDescriptorSetLayout()[0]; - /* * Font uploading */ unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); - size_t upload_size = width * height * 4 * sizeof(char); - - Specifications::TextureSpecification font_tex_spec = {}; - font_tex_spec.Width = width; - font_tex_spec.Height = height; - font_tex_spec.Data = pixels; - font_tex_spec.Format = Specifications::ImageFormat::R8G8B8A8_UNORM; - auto font_texture = renderer->CreateTexture(font_tex_spec); - renderer->Device->GlobalTextures->Add(font_texture); - - VkDescriptorSetAllocateInfo font_alloc_info = {}; - font_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - font_alloc_info.descriptorPool = shader->GetDescriptorPool(); - font_alloc_info.descriptorSetCount = 1; - font_alloc_info.pSetLayouts = &descriptor_setlayout; - ZENGINE_VALIDATE_ASSERT(vkAllocateDescriptorSets(m_renderer->Device->LogicalDevice, &font_alloc_info, &m_font_descriptor_set) == VK_SUCCESS, "Failed to create descriptor set") - - auto font_image_info = font_texture->ImageBuffer->GetDescriptorImageInfo(); - VkWriteDescriptorSet write_desc[1] = {}; - write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_desc[0].dstSet = m_font_descriptor_set; - write_desc[0].descriptorCount = 1; - write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - write_desc[0].pImageInfo = &font_image_info; - vkUpdateDescriptorSets(m_renderer->Device->LogicalDevice, 1, write_desc, 0, nullptr); - - io.Fonts->SetTexID((ImTextureID) m_font_descriptor_set); - /* - * Creating another DescriptorSet from the SetLayout that will serve has Image/Frame output - */ - VkDescriptorSetAllocateInfo frame_alloc_info = {}; - frame_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - frame_alloc_info.descriptorPool = shader->GetDescriptorPool(); - frame_alloc_info.descriptorSetCount = 1; - frame_alloc_info.pSetLayouts = &descriptor_setlayout; - ZENGINE_VALIDATE_ASSERT(vkAllocateDescriptorSets(m_renderer->Device->LogicalDevice, &frame_alloc_info, &m_frame_output) == VK_SUCCESS, "Failed to create descriptor set") - - VkDescriptorSetAllocateInfo image_alloc_info = {}; - image_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - image_alloc_info.descriptorPool = shader->GetDescriptorPool(); - image_alloc_info.descriptorSetCount = 1; - image_alloc_info.pSetLayouts = &descriptor_setlayout; - ZENGINE_VALIDATE_ASSERT(vkAllocateDescriptorSets(m_renderer->Device->LogicalDevice, &image_alloc_info, &m_folder_output) == VK_SUCCESS, "Failed to create descriptor set") - - VkDescriptorSetAllocateInfo image2_alloc_info = {}; - image2_alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; - image2_alloc_info.descriptorPool = shader->GetDescriptorPool(); - image2_alloc_info.descriptorSetCount = 1; - image2_alloc_info.pSetLayouts = &descriptor_setlayout; - ZENGINE_VALIDATE_ASSERT(vkAllocateDescriptorSets(m_renderer->Device->LogicalDevice, &image2_alloc_info, &m_file_output) == VK_SUCCESS, "Failed to create descriptor set") + size_t upload_size = width * height * 4 * sizeof(char); + + Specifications::TextureSpecification font_tex_spec = {}; + font_tex_spec.Width = width; + font_tex_spec.Height = height; + font_tex_spec.Data = pixels; + font_tex_spec.Format = Specifications::ImageFormat::R8G8B8A8_UNORM; + auto font_texture = renderer->CreateTexture(font_tex_spec); + auto font_tex_handle = renderer->Device->GlobalTextures->Add(font_texture); + + io.Fonts->TexID = (ImTextureID) font_tex_handle.Index; + + auto font_image_info = font_texture->ImageBuffer->GetDescriptorImageInfo(); + uint32_t frame_count = renderer->Device->SwapchainImageCount; + auto shader = m_ui_pass->Pipeline->GetShader(); + auto descriptor_set_map = shader->GetDescriptorSetMap(); + std::vector write_descriptor_sets = {}; + + for (unsigned i = 0; i < frame_count; ++i) + { + auto set = descriptor_set_map.at(0)[i]; + write_descriptor_sets.push_back(VkWriteDescriptorSet{.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET, .pNext = nullptr, .dstSet = set, .dstBinding = 0, .dstArrayElement = (uint32_t) font_tex_handle.Index, .descriptorCount = 1, .descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, .pImageInfo = &(font_image_info), .pBufferInfo = nullptr, .pTexelBufferView = nullptr}); + } + + vkUpdateDescriptorSets(renderer->Device->LogicalDevice, write_descriptor_sets.size(), write_descriptor_sets.data(), 0, nullptr); } void ImGUIRenderer::Deinitialize() @@ -267,14 +235,12 @@ namespace ZEngine::Rendering::Renderers // Setup scale and translation: // Our visible imgui space lies from draw_data->DisplayPps (top left) to draw_data->DisplayPos+data_data->DisplaySize (bottom right). DisplayPos is (0,0) for single // viewport apps. - float scale[2]; - scale[0] = 2.0f / draw_data->DisplaySize.x; - scale[1] = 2.0f / draw_data->DisplaySize.y; - float translate[2]; - translate[0] = -1.0f - draw_data->DisplayPos.x * scale[0]; - translate[1] = -1.0f - draw_data->DisplayPos.y * scale[1]; - command_buffer->PushConstants(VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 0, sizeof(float) * 2, scale); - command_buffer->PushConstants(VK_SHADER_STAGE_VERTEX_BIT, sizeof(float) * 2, sizeof(float) * 2, translate); + + PushConstantData pc_data = {}; + pc_data.Scale[0] = 2.0f / draw_data->DisplaySize.x; + pc_data.Scale[1] = 2.0f / draw_data->DisplaySize.y; + pc_data.Translate[0] = -1.0f - draw_data->DisplayPos.x * pc_data.Scale[0]; + pc_data.Translate[1] = -1.0f - draw_data->DisplayPos.y * pc_data.Scale[1]; // Will project scissor/clipping rectangles into framebuffer space ImVec2 clip_off = draw_data->DisplayPos; // (0,0) unless using multi-viewports @@ -313,15 +279,9 @@ namespace ZEngine::Rendering::Renderers scissor.extent.height = (uint32_t) (clip_rect.w - clip_rect.y); command_buffer->SetScissor(scissor); - // Bind DescriptorSet with font or user texture - VkDescriptorSet desc_set[1] = {(VkDescriptorSet) pcmd->TextureId}; - if (sizeof(ImTextureID) < sizeof(ImU64)) - { - // We don't support texture switches if ImTextureID hasn't been redefined to be 64-bit. Do a flaky check that other textures haven't been used. - IM_ASSERT(pcmd->TextureId == (ImTextureID) m_font_descriptor_set); - desc_set[0] = m_font_descriptor_set; - } - command_buffer->BindDescriptorSet(desc_set[0]); + pc_data.TextureId = (uint32_t) (intptr_t) pcmd->TextureId; + command_buffer->PushConstants(VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(PushConstantData), &pc_data); + command_buffer->BindDescriptorSets(frame_index); command_buffer->DrawIndexed(pcmd->ElemCount, 1, pcmd->IdxOffset + global_idx_offset, pcmd->VtxOffset + global_vtx_offset, 0); } } @@ -338,64 +298,4 @@ namespace ZEngine::Rendering::Renderers ImGui::RenderPlatformWindowsDefault(); } } - - VkDescriptorSet ImGUIRenderer::UpdateFrameOutput(const Textures::TextureHandle& handle) - { - auto& texture = m_renderer->Device->GlobalTextures->Access(handle); - auto& buffer = texture->ImageBuffer->GetBuffer(); - - VkDescriptorImageInfo desc_image[1] = {}; - desc_image[0].sampler = buffer.Sampler; - desc_image[0].imageView = buffer.ViewHandle; - desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - VkWriteDescriptorSet write_desc[1] = {}; - write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_desc[0].dstSet = m_frame_output; - write_desc[0].descriptorCount = 1; - write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - write_desc[0].pImageInfo = desc_image; - vkUpdateDescriptorSets(m_renderer->Device->LogicalDevice, 1, write_desc, 0, nullptr); - - return m_frame_output; - } - - VkDescriptorSet ImGUIRenderer::UpdateFileIconOutput(const Textures::TextureHandle& handle) - { - auto& texture = m_renderer->Device->GlobalTextures->Access(handle); - auto& buffer = texture->ImageBuffer->GetBuffer(); - - VkDescriptorImageInfo desc_image[1] = {}; - desc_image[0].sampler = buffer.Sampler; - desc_image[0].imageView = buffer.ViewHandle; - desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - VkWriteDescriptorSet write_desc[1] = {}; - write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_desc[0].dstSet = m_file_output; - write_desc[0].descriptorCount = 1; - write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - write_desc[0].pImageInfo = desc_image; - vkUpdateDescriptorSets(m_renderer->Device->LogicalDevice, 1, write_desc, 0, nullptr); - - return m_file_output; - } - - VkDescriptorSet ImGUIRenderer::UpdateDirIconOutput(const Textures::TextureHandle& handle) - { - auto& texture = m_renderer->Device->GlobalTextures->Access(handle); - auto& buffer = texture->ImageBuffer->GetBuffer(); - - VkDescriptorImageInfo desc_image[1] = {}; - desc_image[0].sampler = buffer.Sampler; - desc_image[0].imageView = buffer.ViewHandle; - desc_image[0].imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - VkWriteDescriptorSet write_desc[1] = {}; - write_desc[0].sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - write_desc[0].dstSet = m_folder_output; - write_desc[0].descriptorCount = 1; - write_desc[0].descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - write_desc[0].pImageInfo = desc_image; - vkUpdateDescriptorSets(m_renderer->Device->LogicalDevice, 1, write_desc, 0, nullptr); - - return m_folder_output; - } } // namespace ZEngine::Rendering::Renderers \ No newline at end of file diff --git a/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.h b/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.h index cb6f47eb..15c75831 100644 --- a/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.h +++ b/ZEngine/ZEngine/Rendering/Renderers/ImGUIRenderer.h @@ -5,26 +5,25 @@ namespace ZEngine::Rendering::Renderers { + struct PushConstantData + { + float Scale[2] = {0}; + float Translate[2] = {0}; + uint32_t TextureId = 0xFFFFFFFFu; + }; + struct GraphicRenderer; struct ImGUIRenderer : public Helpers::RefCounted { - void Initialize(GraphicRenderer* renderer); - void Deinitialize(); - - void StyleDarkTheme(); + void Initialize(GraphicRenderer* renderer); + void Deinitialize(); - void NewFrame(); - void DrawFrame(uint32_t frame_index, Hardwares::CommandBuffer* const command_buffer); + void StyleDarkTheme(); - VkDescriptorSet UpdateFrameOutput(const Textures::TextureHandle& handle); - VkDescriptorSet UpdateFileIconOutput(const Textures::TextureHandle& handle); - VkDescriptorSet UpdateDirIconOutput(const Textures::TextureHandle& handle); + void NewFrame(); + void DrawFrame(uint32_t frame_index, Hardwares::CommandBuffer* const command_buffer); private: - VkDescriptorSet m_frame_output{VK_NULL_HANDLE}; - VkDescriptorSet m_font_descriptor_set{VK_NULL_HANDLE}; - VkDescriptorSet m_folder_output{VK_NULL_HANDLE}; - VkDescriptorSet m_file_output{VK_NULL_HANDLE}; GraphicRenderer* m_renderer; Hardwares::VertexBufferSetHandle m_vertex_buffer_handle; Hardwares::IndexBufferSetHandle m_index_buffer_handle; diff --git a/ZEngine/ZEngine/Rendering/Renderers/RenderGraph.cpp b/ZEngine/ZEngine/Rendering/Renderers/RenderGraph.cpp index d38d9039..a166582c 100644 --- a/ZEngine/ZEngine/Rendering/Renderers/RenderGraph.cpp +++ b/ZEngine/ZEngine/Rendering/Renderers/RenderGraph.cpp @@ -401,7 +401,11 @@ namespace ZEngine::Rendering::Renderers resource.ResourceInfo.TextureSpec.Height = height; auto texture = Renderer->CreateTexture(resource.ResourceInfo.TextureSpec); Renderer->Device->GlobalTextures->Update(resource.ResourceInfo.TextureHandle, texture); - // Renderer->Device->TextureHandleToUpdates.Enqueue(resource.ResourceInfo.TextureHandle); + + if ((output.Name == Renderer->FrameColorRenderTargetName) || (output.Name == Renderer->FrameDepthRenderTargetName)) + { + Renderer->Device->TextureHandleToUpdates.Enqueue(resource.ResourceInfo.TextureHandle); + } pass_spec.ExternalOutputs.emplace_back(resource.ResourceInfo.TextureHandle); } diff --git a/ZEngine/ZEngine/Rendering/Shaders/Shader.cpp b/ZEngine/ZEngine/Rendering/Shaders/Shader.cpp index 4de6e3bb..385c0c00 100644 --- a/ZEngine/ZEngine/Rendering/Shaders/Shader.cpp +++ b/ZEngine/ZEngine/Rendering/Shaders/Shader.cpp @@ -380,11 +380,16 @@ namespace ZEngine::Rendering::Shaders void Shader::CreatePushConstantRange() { - for (const auto& push_constant_spec : m_push_constant_specification_collection) + if (!m_push_constant_specification_collection.empty()) { - m_push_constant_collection.emplace_back(VkPushConstantRange{.stageFlags = ShaderStageFlagsMap[VALUE_FROM_SPEC_MAP(push_constant_spec.Flags)], .offset = push_constant_spec.Offset, .size = push_constant_spec.Size}); + VkPushConstantRange& range = m_push_constant_collection.emplace_back(VkPushConstantRange{.offset = 0}); + for (const auto& push_constant_spec : m_push_constant_specification_collection) + { + range.stageFlags |= ShaderStageFlagsMap[VALUE_FROM_SPEC_MAP(push_constant_spec.Flags)]; + range.size += push_constant_spec.Size; + } + m_push_constant_specification_collection.clear(); + m_push_constant_specification_collection.shrink_to_fit(); } - m_push_constant_specification_collection.clear(); - m_push_constant_specification_collection.shrink_to_fit(); } } // namespace ZEngine::Rendering::Shaders