Add index buffer

This commit is contained in:
Grayson Riffe 2025-02-17 03:21:08 -06:00
parent 7d2b9e6f1b
commit a31ef34262
6 changed files with 63 additions and 20 deletions

View File

@ -12,6 +12,7 @@ namespace nf::client {
, m_styleFullscreen(WS_POPUP) , m_styleFullscreen(WS_POPUP)
, m_currentWidth() , m_currentWidth()
, m_currentHeight() , m_currentHeight()
, m_active(true)
{ {
NFLog("Creating window"); NFLog("Creating window");
@ -76,12 +77,18 @@ namespace nf::client {
TranslateMessage(&msg); TranslateMessage(&msg);
DispatchMessage(&msg); DispatchMessage(&msg);
} }
m_active = false;
} }
void Window::show(bool show) { void Window::show(bool show) {
ShowWindow(m_handle, show ? SW_SHOW : SW_HIDE); ShowWindow(m_handle, show ? SW_SHOW : SW_HIDE);
} }
bool Window::isActive() const {
return m_active;
}
void Window::registerWindowClass() { void Window::registerWindowClass() {
WNDCLASS wc = {}; WNDCLASS wc = {};
wc.lpszClassName = m_wndClassName; wc.lpszClassName = m_wndClassName;

View File

@ -14,6 +14,7 @@ namespace nf::client {
void setDisplay(DisplayConfig& config); void setDisplay(DisplayConfig& config);
void runLoop(); void runLoop();
void show(bool show = true); void show(bool show = true);
bool isActive() const;
~Window(); ~Window();
private: private:
@ -28,5 +29,7 @@ namespace nf::client {
const DWORD m_styleFullscreen; const DWORD m_styleFullscreen;
unsigned int m_currentWidth, m_currentHeight; unsigned int m_currentWidth, m_currentHeight;
bool m_active;
}; };
} }

View File

@ -5,7 +5,7 @@
#include "util.h" #include "util.h"
namespace nf::client::render { 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) : VulkanResource(device)
, m_handle() , m_handle()
, m_memory() , m_memory()
@ -19,7 +19,19 @@ namespace nf::client::render {
std::memcpy(bufferPointer, bufferData, bufferSize); std::memcpy(bufferPointer, bufferData, bufferSize);
vkUnmapMemory(m_device, stagingBufferMemory); 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); copyBuffer(stagingBuffer, m_handle, bufferSize, commandPool, queue);

View File

@ -4,9 +4,14 @@
#include "VulkanResource.h" #include "VulkanResource.h"
namespace nf::client::render { namespace nf::client::render {
enum class BufferType {
Vertex,
Index
};
class Buffer : VulkanResource { class Buffer : VulkanResource {
public: 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; const VkBuffer& getHandle() const;

View File

@ -37,6 +37,7 @@ namespace nf::client::render {
, m_frameExecutors() , m_frameExecutors()
, m_currentFrameExecutor() , m_currentFrameExecutor()
, m_bufferVertex() , m_bufferVertex()
, m_bufferIndex()
{ {
NFLog("Initializing render engine"); NFLog("Initializing render engine");
m_window->setDisplay(m_display); m_window->setDisplay(m_display);
@ -51,7 +52,7 @@ namespace nf::client::render {
createOutputPipeline(); createOutputPipeline();
createFrameExecutors(); createFrameExecutors();
createVertexBuffer(); createBuffers();
m_window->show(); m_window->show();
} }
@ -216,9 +217,9 @@ namespace nf::client::render {
vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &numPresentModes, presentModes.data()); vkGetPhysicalDeviceSurfacePresentModesKHR(m_physicalDevice, m_surface, &numPresentModes, presentModes.data());
VkPresentModeKHR chosenPresentMode = VK_PRESENT_MODE_FIFO_KHR; VkPresentModeKHR chosenPresentMode = VK_PRESENT_MODE_FIFO_KHR;
// TODO: IMMEDIATE isn't always available, so do something about that // 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) if (presentModes[i] == VK_PRESENT_MODE_IMMEDIATE_KHR)
chosenPresentMode = presentModes[i]; chosenPresentMode = presentModes[i];*/
m_swapchainExtent = surfaceCapabilities.currentExtent; m_swapchainExtent = surfaceCapabilities.currentExtent;
if (m_swapchainExtent.width == std::numeric_limits<uint32_t>::max()) if (m_swapchainExtent.width == std::numeric_limits<uint32_t>::max())
@ -442,15 +443,23 @@ namespace nf::client::render {
} }
} }
void RenderEngine::createVertexBuffer() { void RenderEngine::createBuffers() {
std::vector<Vertex> triangleData = { std::vector<Vertex> triangleVertices = {
{{0.0, -0.5}, {1.0, 0.0, 0.0}}, {{-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, 1.0, 0.0}},
{{-0.5, 0.5}, {0.0, 0.0, 1.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(); size_t triangleVerticesSize = sizeof(triangleVertices[0]) * triangleVertices.size();
m_bufferVertex = new Buffer(m_device, m_physicalDevice, m_commandPool, m_queueGraphics, triangleData.data(), triangleDataSize); m_bufferVertex = new Buffer(BufferType::Vertex, m_device, m_physicalDevice, m_commandPool, m_queueGraphics, triangleVertices.data(), triangleVerticesSize);
std::vector<uint32_t> 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() { void RenderEngine::doFrame() {
@ -500,12 +509,13 @@ namespace nf::client::render {
VkRect2D scissor = { {}, m_swapchainExtent }; VkRect2D scissor = { {}, m_swapchainExtent };
vkCmdSetScissor(commandBuffer, 0, 1, &scissor); vkCmdSetScissor(commandBuffer, 0, 1, &scissor);
// Bind vertex buffer // Bind buffers
VkDeviceSize vertexBufferOffset = 0; VkDeviceSize bufferOffset = 0;
vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_bufferVertex->getHandle(), &vertexBufferOffset); vkCmdBindVertexBuffers(commandBuffer, 0, 1, &m_bufferVertex->getHandle(), &bufferOffset);
vkCmdBindIndexBuffer(commandBuffer, m_bufferIndex->getHandle(), 0, VK_INDEX_TYPE_UINT32);
// Draw // Draw
vkCmdDraw(commandBuffer, 3, 1, 0, 0); vkCmdDrawIndexed(commandBuffer, 6, 1, 0, 0, 0);
// End the render pass // End the render pass
vkCmdEndRenderPass(commandBuffer); vkCmdEndRenderPass(commandBuffer);
@ -552,6 +562,10 @@ namespace nf::client::render {
} }
void RenderEngine::recreateSwapchain() { void RenderEngine::recreateSwapchain() {
// Might be here due to window closing
if (!m_window->isActive())
return;
waitIdle(); waitIdle();
destroySwapchain(); destroySwapchain();
@ -577,14 +591,15 @@ namespace nf::client::render {
RenderEngine::~RenderEngine() { RenderEngine::~RenderEngine() {
waitIdle(); waitIdle();
delete m_bufferIndex;
delete m_bufferVertex;
for (int i = 0; i < m_frameExecutors.size(); i++) { for (int i = 0; i < m_frameExecutors.size(); i++) {
vkDestroyFence(m_device, m_frameExecutors[i].fenceFrameInFlight, nullptr); vkDestroyFence(m_device, m_frameExecutors[i].fenceFrameInFlight, nullptr);
vkDestroySemaphore(m_device, m_frameExecutors[i].semaphoreRenderFinished, nullptr); vkDestroySemaphore(m_device, m_frameExecutors[i].semaphoreRenderFinished, nullptr);
vkDestroySemaphore(m_device, m_frameExecutors[i].semaphoreImageAvailable, nullptr); vkDestroySemaphore(m_device, m_frameExecutors[i].semaphoreImageAvailable, nullptr);
} }
delete m_bufferVertex;
destroySwapchain(); destroySwapchain();
vkDestroyCommandPool(m_device, m_commandPool, nullptr); vkDestroyCommandPool(m_device, m_commandPool, nullptr);
vkDestroyPipeline(m_device, m_pipelineOutput, nullptr); vkDestroyPipeline(m_device, m_pipelineOutput, nullptr);

View File

@ -31,7 +31,7 @@ namespace nf::client::render {
void createOutputPipeline(); void createOutputPipeline();
void createFrameExecutors(); void createFrameExecutors();
void createVertexBuffer(); void createBuffers();
void recreateSwapchain(); void recreateSwapchain();
void destroySwapchain(); void destroySwapchain();
@ -69,5 +69,6 @@ namespace nf::client::render {
uint32_t m_currentFrameExecutor; uint32_t m_currentFrameExecutor;
Buffer* m_bufferVertex; Buffer* m_bufferVertex;
Buffer* m_bufferIndex;
}; };
} }