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_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;

View File

@ -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;
};
}

View File

@ -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);

View File

@ -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;

View File

@ -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<uint32_t>::max())
@ -442,15 +443,23 @@ namespace nf::client::render {
}
}
void RenderEngine::createVertexBuffer() {
std::vector<Vertex> 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<Vertex> 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<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() {
@ -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);

View File

@ -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;
};
}