diff --git a/NothinFancy/src/client/Window.cpp b/NothinFancy/src/client/Window.cpp index 4223137..0b7eab5 100644 --- a/NothinFancy/src/client/Window.cpp +++ b/NothinFancy/src/client/Window.cpp @@ -12,6 +12,7 @@ namespace nf::client { , m_styleFullscreen(WS_POPUP) , m_currentWidth() , m_currentHeight() + , m_active(true) { NFLog("Creating window"); @@ -76,12 +77,18 @@ namespace nf::client { TranslateMessage(&msg); DispatchMessage(&msg); } + + m_active = false; } void Window::show(bool show) { ShowWindow(m_handle, show ? SW_SHOW : SW_HIDE); } + bool Window::isActive() const { + return m_active; + } + void Window::registerWindowClass() { WNDCLASS wc = {}; wc.lpszClassName = m_wndClassName; diff --git a/NothinFancy/src/client/Window.h b/NothinFancy/src/client/Window.h index e772f56..f8b525a 100644 --- a/NothinFancy/src/client/Window.h +++ b/NothinFancy/src/client/Window.h @@ -14,6 +14,7 @@ namespace nf::client { void setDisplay(DisplayConfig& config); void runLoop(); void show(bool show = true); + bool isActive() const; ~Window(); private: @@ -28,5 +29,7 @@ namespace nf::client { const DWORD m_styleFullscreen; unsigned int m_currentWidth, m_currentHeight; + + bool m_active; }; } diff --git a/NothinFancy/src/client/render/Buffer.cpp b/NothinFancy/src/client/render/Buffer.cpp index 3abfe4b..10bac89 100644 --- a/NothinFancy/src/client/render/Buffer.cpp +++ b/NothinFancy/src/client/render/Buffer.cpp @@ -5,7 +5,7 @@ #include "util.h" namespace nf::client::render { - Buffer::Buffer(const VkDevice& device, const VkPhysicalDevice& physicalDevice, const VkCommandPool& commandPool, const VkQueue& queue, void* bufferData, size_t bufferSize) + Buffer::Buffer(BufferType type, const VkDevice& device, const VkPhysicalDevice& physicalDevice, const VkCommandPool& commandPool, const VkQueue& queue, void* bufferData, size_t bufferSize) : VulkanResource(device) , m_handle() , m_memory() @@ -19,7 +19,19 @@ namespace nf::client::render { std::memcpy(bufferPointer, bufferData, bufferSize); vkUnmapMemory(m_device, stagingBufferMemory); - createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_VERTEX_BUFFER_BIT, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, physicalDevice, m_handle, m_memory); + VkBufferUsageFlags mainUsage = NULL; + + switch (type) { + case BufferType::Vertex: + mainUsage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; + break; + + case BufferType::Index: + mainUsage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; + break; + } + + createBuffer(bufferSize, VK_BUFFER_USAGE_TRANSFER_DST_BIT | mainUsage, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, physicalDevice, m_handle, m_memory); copyBuffer(stagingBuffer, m_handle, bufferSize, commandPool, queue); diff --git a/NothinFancy/src/client/render/Buffer.h b/NothinFancy/src/client/render/Buffer.h index f3d11fa..6fadbde 100644 --- a/NothinFancy/src/client/render/Buffer.h +++ b/NothinFancy/src/client/render/Buffer.h @@ -4,9 +4,14 @@ #include "VulkanResource.h" namespace nf::client::render { + enum class BufferType { + Vertex, + Index + }; + class Buffer : VulkanResource { public: - Buffer(const VkDevice& device, const VkPhysicalDevice& physicalDevice, const VkCommandPool& commandPool, const VkQueue& queue, void* bufferData, size_t bufferSize); + Buffer(BufferType type, const VkDevice& device, const VkPhysicalDevice& physicalDevice, const VkCommandPool& commandPool, const VkQueue& queue, void* bufferData, size_t bufferSize); const VkBuffer& getHandle() const; diff --git a/NothinFancy/src/client/render/RenderEngine.cpp b/NothinFancy/src/client/render/RenderEngine.cpp index 4ed4bef..5e023e9 100644 --- a/NothinFancy/src/client/render/RenderEngine.cpp +++ b/NothinFancy/src/client/render/RenderEngine.cpp @@ -37,6 +37,7 @@ namespace nf::client::render { , m_frameExecutors() , m_currentFrameExecutor() , m_bufferVertex() + , m_bufferIndex() { NFLog("Initializing render engine"); m_window->setDisplay(m_display); @@ -51,7 +52,7 @@ namespace nf::client::render { createOutputPipeline(); createFrameExecutors(); - createVertexBuffer(); + createBuffers(); m_window->show(); } @@ -216,9 +217,9 @@ namespace nf::client::render { vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &numPresentModes, presentModes.data()); VkPresentModeKHR chosenPresentMode = VK_PRESENT_MODE_FIFO_KHR; // TODO: IMMEDIATE isn't always available, so do something about that - for (int i = 0; i < presentModes.size(); i++) + /*for (int i = 0; i < presentModes.size(); i++) if (presentModes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR) - chosenPresentMode = presentModes[i]; + chosenPresentMode = presentModes[i];*/ m_swapchainExtent = surfaceCapabilities.currentExtent; if (m_swapchainExtent.width == std::numeric_limits::max()) @@ -442,15 +443,23 @@ namespace nf::client::render { } } - void RenderEngine::createVertexBuffer() { - std::vector triangleData = { - {{0.0, -0.5}, {1.0, 0.0, 0.0}}, - {{0.5, 0.5}, {0.0, 1.0, 0.0}}, - {{-0.5, 0.5}, {0.0, 0.0, 1.0}} + void RenderEngine::createBuffers() { + std::vector triangleVertices = { + {{-0.5, -0.5}, {1.0, 0.0, 0.0}}, + {{ 0.5, -0.5}, {0.0, 1.0, 0.0}}, + {{ 0.5, 0.5}, {0.0, 0.0, 1.0}}, + {{-0.5, 0.5}, {1.0, 0.0, 1.0}} }; - size_t triangleDataSize = sizeof(triangleData[0]) * triangleData.size(); - m_bufferVertex = new Buffer(m_device, m_physicalDevice, m_commandPool, m_queueGraphics, triangleData.data(), triangleDataSize); + size_t triangleVerticesSize = sizeof(triangleVertices[0]) * triangleVertices.size(); + m_bufferVertex = new Buffer(BufferType::Vertex, m_device, m_physicalDevice, m_commandPool, m_queueGraphics, triangleVertices.data(), triangleVerticesSize); + + std::vector triangleIndices = { + 0, 1, 2, 2, 3, 0 + }; + + size_t triangleIndicesSize = sizeof(triangleIndices[0]) * triangleIndices.size(); + m_bufferIndex = new Buffer(BufferType::Index, m_device, m_physicalDevice, m_commandPool, m_queueGraphics, triangleIndices.data(), triangleIndicesSize); } void RenderEngine::doFrame() { @@ -500,12 +509,13 @@ namespace nf::client::render { VkRect2D scissor = { {}, m_swapchainExtent }; vkCmdSetScissor(commandBuffer, 0, 1, &scissor); - // Bind vertex buffer - VkDeviceSize vertexBufferOffset = 0; - vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_bufferVertex->getHandle(), &vertexBufferOffset); + // Bind buffers + VkDeviceSize bufferOffset = 0; + vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_bufferVertex->getHandle(), &bufferOffset); + vkCmdBindIndexBuffer(commandBuffer, m_bufferIndex->getHandle(), 0, VK_INDEX_TYPE_UINT32); // Draw - vkCmdDraw(commandBuffer, 3, 1, 0, 0); + vkCmdDrawIndexed(commandBuffer, 6, 1, 0, 0, 0); // End the render pass vkCmdEndRenderPass(commandBuffer); @@ -552,6 +562,10 @@ namespace nf::client::render { } void RenderEngine::recreateSwapchain() { + // Might be here due to window closing + if (!m_window->isActive()) + return; + waitIdle(); destroySwapchain(); @@ -577,14 +591,15 @@ namespace nf::client::render { RenderEngine::~RenderEngine() { waitIdle(); + delete m_bufferIndex; + delete m_bufferVertex; + for (int i = 0; i < m_frameExecutors.size(); i++) { vkDestroyFence(m_device, m_frameExecutors[i].fenceFrameInFlight, nullptr); vkDestroySemaphore(m_device, m_frameExecutors[i].semaphoreRenderFinished, nullptr); vkDestroySemaphore(m_device, m_frameExecutors[i].semaphoreImageAvailable, nullptr); } - delete m_bufferVertex; - destroySwapchain(); vkDestroyCommandPool(m_device, m_commandPool, nullptr); vkDestroyPipeline(m_device, m_pipelineOutput, nullptr); diff --git a/NothinFancy/src/client/render/RenderEngine.h b/NothinFancy/src/client/render/RenderEngine.h index e4cd1db..0cf8e8f 100644 --- a/NothinFancy/src/client/render/RenderEngine.h +++ b/NothinFancy/src/client/render/RenderEngine.h @@ -31,7 +31,7 @@ namespace nf::client::render { void createOutputPipeline(); void createFrameExecutors(); - void createVertexBuffer(); + void createBuffers(); void recreateSwapchain(); void destroySwapchain(); @@ -69,5 +69,6 @@ namespace nf::client::render { uint32_t m_currentFrameExecutor; Buffer* m_bufferVertex; + Buffer* m_bufferIndex; }; }