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