summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJonathan Bradley <jcb@pikum.xyz>2023-09-18 07:25:55 -0400
committerJonathan Bradley <jcb@pikum.xyz>2023-09-18 07:25:55 -0400
commitaa880ba627b3c18ea9538416bae6f060e72b43d3 (patch)
treec05d0b00a0d2246a6d06d5ade7139bdfe0654c4d /src
parentb99d942010ed0ee678fafb917a4afd14c8a88fbc (diff)
uniform buffer first pass, created but not used
Diffstat (limited to 'src')
-rw-r--r--src/window.cpp39
-rw-r--r--src/window.hpp7
2 files changed, 46 insertions, 0 deletions
diff --git a/src/window.cpp b/src/window.cpp
index 8e91184..de391a2 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -60,6 +60,8 @@ VkCommandBuffer presentCommandBuffers[MAX_FRAMES_IN_FLIGHT];
VkSemaphore presentImageAvailableSemaphores[MAX_FRAMES_IN_FLIGHT];
VkSemaphore presentRenderFinishedSemaphores[MAX_FRAMES_IN_FLIGHT];
VkFence presentInFlightFences[MAX_FRAMES_IN_FLIGHT];
+VkDeviceMemory uniformBufferMemory;
+VkBuffer uniformBuffers[MAX_FRAMES_IN_FLIGHT];
/*
* ImGui
@@ -955,6 +957,40 @@ void CreateCommandBuffer() {
}
}
+void CreateUniformBuffers() {
+ uint32_t queueFamilyIndexes[2] = {graphicsFamilyIndex, transferFamilyIndex};
+ VkBufferCreateInfo vkBufferCreateInfo;
+ vkBufferCreateInfo.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
+ vkBufferCreateInfo.pNext = nullptr;
+ vkBufferCreateInfo.flags = {};
+ vkBufferCreateInfo.size = sizeof(UniformBufferObject);
+ vkBufferCreateInfo.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
+ vkBufferCreateInfo.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
+ vkBufferCreateInfo.queueFamilyIndexCount = graphicsFamilyIndex == transferFamilyIndex ? 1 : 2;
+ vkBufferCreateInfo.pQueueFamilyIndices = queueFamilyIndexes;
+
+ vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &uniformBuffers[0]);
+
+ VkMemoryRequirements memReqs;
+ vkGetBufferMemoryRequirements(vkDevice, uniformBuffers[0], &memReqs);
+
+ VkMemoryAllocateInfo vkMemoryAllocateInfo;
+ vkMemoryAllocateInfo.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
+ vkMemoryAllocateInfo.pNext = nullptr;
+ vkMemoryAllocateInfo.allocationSize = memReqs.size * MAX_FRAMES_IN_FLIGHT;
+ vkMemoryAllocateInfo.memoryTypeIndex = FindMemoryTypeIndex(memReqs.memoryTypeBits, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
+
+ vkAllocateMemory(vkDevice, &vkMemoryAllocateInfo, vkAllocator, &uniformBufferMemory);
+
+ vkDestroyBuffer(vkDevice, uniformBuffers[0], vkAllocator);
+ vkBufferCreateInfo.size = memReqs.size;
+
+ for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ vkCreateBuffer(vkDevice, &vkBufferCreateInfo, vkAllocator, &uniformBuffers[i]);
+ vkBindBufferMemory(vkDevice, uniformBuffers[i], uniformBufferMemory, memReqs.size * i);
+ }
+}
+
void CreateSyncObjects() {
VkSemaphoreCreateInfo semaphoreInfo;
semaphoreInfo.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
@@ -1207,6 +1243,7 @@ void CreateWindow(PKEWindowProperties *wp) {
CreateFramebuffers();
CreateCommandPool();
CreateCommandBuffer();
+ CreateUniformBuffers();
CreateSyncObjects();
CreateImGui();
}
@@ -1218,10 +1255,12 @@ void DestroyWindow() {
ImGui::DestroyContext();
DestroySwapchain();
for (long i = 0; i < MAX_FRAMES_IN_FLIGHT; ++i) {
+ vkDestroyBuffer(vkDevice, uniformBuffers[i], vkAllocator);
vkDestroySemaphore(vkDevice, presentImageAvailableSemaphores[i], vkAllocator);
vkDestroySemaphore(vkDevice, presentRenderFinishedSemaphores[i], vkAllocator);
vkDestroyFence(vkDevice, presentInFlightFences[i], vkAllocator);
}
+ vkFreeMemory(vkDevice, uniformBufferMemory, vkAllocator);
vkDestroyCommandPool(vkDevice, graphicsCommandPool, vkAllocator);
vkDestroyCommandPool(vkDevice, transferCommandPool, vkAllocator);
vkDestroyPipeline(vkDevice, graphicsPipeline, vkAllocator);
diff --git a/src/window.hpp b/src/window.hpp
index ce79dd5..430151e 100644
--- a/src/window.hpp
+++ b/src/window.hpp
@@ -9,6 +9,7 @@
#include "memory.hpp"
#include "ecs.hpp"
+#include "glm/mat4x4.hpp"
#include <cstring>
#include <cstdio>
#include <vector>
@@ -41,6 +42,12 @@ struct PKEWindowProperties {
unsigned int height = 720;
};
+struct UniformBufferObject {
+ glm::mat4 model;
+ glm::mat4 view;
+ glm::mat4 proj;
+};
+
void CreateWindow(PKEWindowProperties *wp);
void DestroyWindow();
VkShaderModule UploadShader(AssetHandle handle);