diff --git a/Nuake/src/Rendering/Vulkan/VulkanAllocatedBuffer.cpp b/Nuake/src/Rendering/Vulkan/VulkanAllocatedBuffer.cpp index 7a52b6a9..04d936bc 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanAllocatedBuffer.cpp +++ b/Nuake/src/Rendering/Vulkan/VulkanAllocatedBuffer.cpp @@ -36,7 +36,7 @@ GPUMeshBuffers::GPUMeshBuffers(std::vector vertices, std::vectorvertexBuffer.GetBuffer(); @@ -388,21 +398,6 @@ void VkRenderer::UpdateDescriptorSets() bufferWrite.pBufferInfo = &bufferInfo; vkUpdateDescriptorSets(Device, 1, &bufferWrite, 0, nullptr); - // Update descriptor set for cameras - VkDescriptorBufferInfo camBufferInfo{}; - //bufferInfo.buffer = 0; - bufferInfo.offset = 0; - bufferInfo.range = VK_WHOLE_SIZE; - - VkWriteDescriptorSet bufferWriteCam = {}; - bufferWriteCam.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET; - bufferWriteCam.pNext = nullptr; - bufferWriteCam.dstBinding = 0; - bufferWriteCam.dstSet = CameraBufferDescriptors; - bufferWriteCam.descriptorCount = 1; - bufferWriteCam.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - bufferWriteCam.pBufferInfo = &camBufferInfo; - vkUpdateDescriptorSets(Device, 1, &bufferWriteCam, 0, nullptr); } void VkRenderer::InitPipeline() @@ -448,11 +443,13 @@ void VkRenderer::InitTrianglePipeline() bufferRange.size = sizeof(GPUDrawPushConstants); bufferRange.stageFlags = VK_SHADER_STAGE_VERTEX_BIT; + VkDescriptorSetLayout layouts[] = { TriangleBufferDescriptorLayout, CameraBufferDescriptorLayout }; + VkPipelineLayoutCreateInfo pipeline_layout_info = VulkanInit::PipelineLayoutCreateInfo(); pipeline_layout_info.pPushConstantRanges = &bufferRange; pipeline_layout_info.pushConstantRangeCount = 1; - pipeline_layout_info.pSetLayouts = &TriangleBufferDescriptorLayout; - pipeline_layout_info.setLayoutCount = 1; + pipeline_layout_info.pSetLayouts = layouts; + pipeline_layout_info.setLayoutCount = 2; VK_CALL(vkCreatePipelineLayout(Device, &pipeline_layout_info, nullptr, &TrianglePipelineLayout)); @@ -502,6 +499,7 @@ void VkRenderer::DrawGeometry(VkCommandBuffer cmd) vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, TrianglePipeline); + vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, TrianglePipelineLayout, 0, 1, &CameraBufferDescriptors, 0, nullptr); vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, TrianglePipelineLayout, 0, 1, &TriangleBufferDescriptors, 0, nullptr); //set dynamic viewport and scissor @@ -846,6 +844,22 @@ void VkRenderer::ImmediateSubmit(std::function&& func VK_CALL(vkWaitForFences(Device, 1, &ImguiFence, true, 9999999999)); } +void VkRenderer::UploadCameraData(const CameraData& data) +{ + void* mappedData; + vmaMapMemory(VulkanAllocator::Get().GetAllocator(), (GetCurrentFrame().CameraStagingBuffer.GetAllocation()), &mappedData); + memcpy(mappedData, &data, sizeof(data)); + + ImmediateSubmit([&](VkCommandBuffer cmd) { + VkBufferCopy copy{ 0 }; + copy.dstOffset = 0; + copy.srcOffset = 0; + copy.size = sizeof(data); + + vkCmdCopyBuffer(cmd, GetCurrentFrame().CameraStagingBuffer.GetBuffer(), CameraBuffer.GetBuffer(), 1, ©); + }); +} + Ref VkRenderer::UploadMesh(std::vector indices, std::vector vertices) { const size_t vertexBufferSize = vertices.size() * sizeof(VkVertex); diff --git a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h index 6ef43750..e0105caa 100644 --- a/Nuake/src/Rendering/Vulkan/VulkanRenderer.h +++ b/Nuake/src/Rendering/Vulkan/VulkanRenderer.h @@ -9,6 +9,8 @@ #include "VulkanTypes.h" #include "VkVertex.h" +#include "VulkanAllocatedBuffer.h" + #include #include @@ -19,7 +21,7 @@ namespace Nuake { class VulkanShader; class GPUMeshBuffers; - + struct AllocatedImage { VkImage image; @@ -79,6 +81,8 @@ namespace Nuake VkCommandPool CommandPool; // This is like the allocator for a buffer. VkCommandBuffer CommandBuffer; // You send commands in there. + AllocatedBuffer CameraStagingBuffer; + // Semaphore are for GPU -> GPU sync // Fence are for CPU -> GPU // Two, one for window, other for rendering @@ -191,8 +195,7 @@ namespace Nuake // Buffers Ref rectangle; - Matrix4 View; - Matrix4 Projection; + AllocatedBuffer CameraBuffer; public: static VkRenderer& Get() @@ -238,12 +241,11 @@ namespace Nuake void ImmediateSubmit(std::function&& function); + void UploadCameraData(const CameraData& data); Ref UploadMesh(std::vector indices, std::vector vertices); VkDescriptorSet GetViewportDescriptor() const { return DrawImageDescriptors; } Ref GetDrawImage() const { return DrawImage; } }; - - } \ No newline at end of file