Add index buffer
This commit is contained in:
parent
7d2b9e6f1b
commit
a31ef34262
@ -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;
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user