mirror of
https://github.com/bailwillharr/engine.git
synced 2024-09-21 04:51:18 +00:00
do stuff
This commit is contained in:
parent
46895c0d4b
commit
df02820c7d
@ -19,10 +19,9 @@ namespace engine {
|
|||||||
GFXDevice& operator=(const GFXDevice&) = delete;
|
GFXDevice& operator=(const GFXDevice&) = delete;
|
||||||
~GFXDevice();
|
~GFXDevice();
|
||||||
|
|
||||||
// adds a vertex buffer draw call to the queue
|
// adds a draw call to the queue
|
||||||
void drawBuffer(const gfx::Pipeline* pipeline, const gfx::Buffer* vertexBuffer, uint32_t count);
|
// vertexBuffer is required. indexBuffer and uniformData can be NULL
|
||||||
|
void draw(const gfx::Pipeline* pipeline, const gfx::Buffer* vertexBuffer, const gfx::Buffer* indexBuffer, uint32_t count, const void* uniformData);
|
||||||
void drawIndexed(const gfx::Pipeline* pipeline, const gfx::Buffer* vertexBuffer, const gfx::Buffer* indexBuffer, uint32_t indexCount);
|
|
||||||
|
|
||||||
// Call once per frame. Executes all queued draw calls and renders to the screen.
|
// Call once per frame. Executes all queued draw calls and renders to the screen.
|
||||||
void renderFrame();
|
void renderFrame();
|
||||||
|
@ -6,6 +6,13 @@
|
|||||||
#include "log.hpp"
|
#include "log.hpp"
|
||||||
|
|
||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
|
#include <glm/ext.hpp>
|
||||||
|
|
||||||
|
struct UBO {
|
||||||
|
glm::mat4 model{};
|
||||||
|
glm::mat4 view{};
|
||||||
|
glm::mat4 proj{};
|
||||||
|
};
|
||||||
|
|
||||||
static engine::gfx::Pipeline* pipeline;
|
static engine::gfx::Pipeline* pipeline;
|
||||||
static engine::gfx::Buffer* vb;
|
static engine::gfx::Buffer* vb;
|
||||||
@ -29,11 +36,7 @@ namespace engine {
|
|||||||
};
|
};
|
||||||
vertFormat.attributeDescriptions.push_back({0, gfx::VertexAttribFormat::VEC2, 0});
|
vertFormat.attributeDescriptions.push_back({0, gfx::VertexAttribFormat::VEC2, 0});
|
||||||
vertFormat.attributeDescriptions.push_back({1, gfx::VertexAttribFormat::VEC3, offsetof(Vertex, col)});
|
vertFormat.attributeDescriptions.push_back({1, gfx::VertexAttribFormat::VEC3, offsetof(Vertex, col)});
|
||||||
struct UBO {
|
|
||||||
glm::mat4 model{};
|
|
||||||
glm::mat4 view{};
|
|
||||||
glm::mat4 proj{};
|
|
||||||
};
|
|
||||||
pipeline = m_gfx->createPipeline(resMan.getFilePath("shader.vert.spv").string().c_str(), resMan.getFilePath("shader.frag.spv").string().c_str(), vertFormat, sizeof(UBO));
|
pipeline = m_gfx->createPipeline(resMan.getFilePath("shader.vert.spv").string().c_str(), resMan.getFilePath("shader.frag.spv").string().c_str(), vertFormat, sizeof(UBO));
|
||||||
|
|
||||||
const std::vector<Vertex> vertices = {
|
const std::vector<Vertex> vertices = {
|
||||||
@ -48,9 +51,6 @@ namespace engine {
|
|||||||
};
|
};
|
||||||
ib = m_gfx->createBuffer(gfx::BufferType::INDEX, sizeof(uint32_t) * indices.size(), indices.data());
|
ib = m_gfx->createBuffer(gfx::BufferType::INDEX, sizeof(uint32_t) * indices.size(), indices.data());
|
||||||
|
|
||||||
UBO initialUbo{};
|
|
||||||
// ub = m_gfx->createBuffer(gfx::BufferType::UNIFORM, sizeof(UBO), &initialUbo);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Application::~Application()
|
Application::~Application()
|
||||||
@ -89,8 +89,13 @@ namespace engine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* draw */
|
/* draw */
|
||||||
|
UBO initialUbo{
|
||||||
m_gfx->drawIndexed(pipeline, vb, ib, 6);
|
.model = glm::mat4{1.0f},
|
||||||
|
.view = glm::mat4{1.0f},
|
||||||
|
.proj = glm::mat4{1.0f}
|
||||||
|
};
|
||||||
|
initialUbo.model = glm::scale(glm::mat4{ 1.0f }, glm::vec3{ 0.5f, 0.5f, 1.0f });
|
||||||
|
m_gfx->draw(pipeline, vb, ib, 6, &initialUbo);
|
||||||
|
|
||||||
m_gfx->renderFrame();
|
m_gfx->renderFrame();
|
||||||
|
|
||||||
|
@ -94,6 +94,8 @@ namespace engine {
|
|||||||
VkPipelineLayout layout = VK_NULL_HANDLE;
|
VkPipelineLayout layout = VK_NULL_HANDLE;
|
||||||
VkPipeline handle = VK_NULL_HANDLE;
|
VkPipeline handle = VK_NULL_HANDLE;
|
||||||
std::vector<gfx::Buffer*> uniformBuffers{};
|
std::vector<gfx::Buffer*> uniformBuffers{};
|
||||||
|
VkDescriptorPool descriptorPool = VK_NULL_HANDLE;
|
||||||
|
std::array<VkDescriptorSet, FRAMES_IN_FLIGHT> descriptorSets{};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -1070,29 +1072,32 @@ namespace engine {
|
|||||||
vkDestroyInstance(pimpl->instance, nullptr);
|
vkDestroyInstance(pimpl->instance, nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GFXDevice::drawBuffer(const gfx::Pipeline* pipeline, const gfx::Buffer* vertexBuffer, uint32_t count)
|
void GFXDevice::draw(const gfx::Pipeline* pipeline, const gfx::Buffer* vertexBuffer, const gfx::Buffer* indexBuffer, uint32_t count, const void* uniformData)
|
||||||
{
|
{
|
||||||
assert(vertexBuffer->type == gfx::BufferType::VERTEX);
|
assert(vertexBuffer->type == gfx::BufferType::VERTEX);
|
||||||
|
assert(vertexBuffer != nullptr);
|
||||||
|
assert(indexBuffer == nullptr || indexBuffer->type == gfx::BufferType::INDEX);
|
||||||
|
|
||||||
|
VkResult res;
|
||||||
|
|
||||||
DrawCall call{
|
DrawCall call{
|
||||||
.vertexBuffer = vertexBuffer,
|
.vertexBuffer = vertexBuffer,
|
||||||
.indexBuffer = nullptr, // don't use indexed drawing
|
.indexBuffer = indexBuffer, // will be ignored if nullptr
|
||||||
.count = count,
|
.count = count,
|
||||||
};
|
};
|
||||||
|
|
||||||
pimpl->drawQueues[pipeline].push(call);
|
if (uniformData != nullptr) {
|
||||||
}
|
uint32_t frameIndex = pimpl->FRAMECOUNT % FRAMES_IN_FLIGHT;
|
||||||
|
|
||||||
void GFXDevice::drawIndexed(const gfx::Pipeline* pipeline, const gfx::Buffer* vertexBuffer, const gfx::Buffer* indexBuffer, uint32_t count)
|
void* dest;
|
||||||
{
|
res = vmaMapMemory(pimpl->allocator, pipeline->uniformBuffers[frameIndex]->allocation, &dest);
|
||||||
assert(vertexBuffer->type == gfx::BufferType::VERTEX);
|
assert(res == VK_SUCCESS);
|
||||||
assert(indexBuffer->type == gfx::BufferType::INDEX);
|
|
||||||
|
|
||||||
DrawCall call{
|
memcpy(dest, uniformData, pipeline->uniformBuffers[frameIndex]->size);
|
||||||
.vertexBuffer = vertexBuffer,
|
|
||||||
.indexBuffer = indexBuffer, // don't use indexed drawing
|
vmaUnmapMemory(pimpl->allocator, pipeline->uniformBuffers[frameIndex]->allocation);
|
||||||
.count = count,
|
|
||||||
};
|
}
|
||||||
|
|
||||||
pimpl->drawQueues[pipeline].push(call);
|
pimpl->drawQueues[pipeline].push(call);
|
||||||
}
|
}
|
||||||
@ -1163,9 +1168,11 @@ namespace engine {
|
|||||||
|
|
||||||
for (auto& [pipeline, queue] : pimpl->drawQueues) {
|
for (auto& [pipeline, queue] : pimpl->drawQueues) {
|
||||||
vkCmdBindPipeline(pimpl->commandBuffers[frameIndex], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->handle);
|
vkCmdBindPipeline(pimpl->commandBuffers[frameIndex], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->handle);
|
||||||
|
vkCmdBindDescriptorSets(pimpl->commandBuffers[frameIndex], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline->layout, 0, 1, &pipeline->descriptorSets[frameIndex], 0, nullptr);
|
||||||
while (queue.empty() == false) {
|
while (queue.empty() == false) {
|
||||||
DrawCall call = queue.front();
|
DrawCall call = queue.front();
|
||||||
vkCmdBindVertexBuffers(pimpl->commandBuffers[frameIndex], 0, 1, &call.vertexBuffer->buffer, offsets);
|
vkCmdBindVertexBuffers(pimpl->commandBuffers[frameIndex], 0, 1, &call.vertexBuffer->buffer, offsets);
|
||||||
|
|
||||||
if (call.indexBuffer == nullptr) {
|
if (call.indexBuffer == nullptr) {
|
||||||
// do a simple draw call
|
// do a simple draw call
|
||||||
vkCmdDraw(pimpl->commandBuffers[frameIndex], call.count, 1, 0, 0);
|
vkCmdDraw(pimpl->commandBuffers[frameIndex], call.count, 1, 0, 0);
|
||||||
@ -1252,6 +1259,46 @@ namespace engine {
|
|||||||
pipeline->uniformBuffers[i] = buf;
|
pipeline->uniformBuffers[i] = buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create descriptor pool for uniform buffers
|
||||||
|
VkDescriptorPoolSize poolSize{};
|
||||||
|
poolSize.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
|
poolSize.descriptorCount = FRAMES_IN_FLIGHT;
|
||||||
|
VkDescriptorPoolCreateInfo poolInfo{};
|
||||||
|
poolInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
|
||||||
|
poolInfo.poolSizeCount = 1;
|
||||||
|
poolInfo.pPoolSizes = &poolSize;
|
||||||
|
poolInfo.maxSets = FRAMES_IN_FLIGHT;
|
||||||
|
res = vkCreateDescriptorPool(pimpl->device, &poolInfo, nullptr, &pipeline->descriptorPool);
|
||||||
|
assert(res == VK_SUCCESS);
|
||||||
|
|
||||||
|
std::array<VkDescriptorSetLayout, FRAMES_IN_FLIGHT> layouts;
|
||||||
|
layouts.fill(pimpl->uboLayout);
|
||||||
|
VkDescriptorSetAllocateInfo dSetAllocInfo{};
|
||||||
|
dSetAllocInfo.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
|
||||||
|
dSetAllocInfo.descriptorPool = pipeline->descriptorPool;
|
||||||
|
dSetAllocInfo.descriptorSetCount = FRAMES_IN_FLIGHT;
|
||||||
|
dSetAllocInfo.pSetLayouts = layouts.data();
|
||||||
|
res = vkAllocateDescriptorSets(pimpl->device, &dSetAllocInfo, pipeline->descriptorSets.data());
|
||||||
|
|
||||||
|
for (int i = 0; i < FRAMES_IN_FLIGHT; i++) {
|
||||||
|
VkDescriptorBufferInfo bufferInfo{};
|
||||||
|
bufferInfo.buffer = pipeline->uniformBuffers[i]->buffer;
|
||||||
|
bufferInfo.offset = 0;
|
||||||
|
bufferInfo.range = uniformBufferSize;
|
||||||
|
VkWriteDescriptorSet descriptorWrite{};
|
||||||
|
descriptorWrite.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
|
||||||
|
descriptorWrite.dstSet = pipeline->descriptorSets[i];
|
||||||
|
descriptorWrite.dstBinding = 0;
|
||||||
|
descriptorWrite.dstArrayElement = 0;
|
||||||
|
descriptorWrite.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
|
||||||
|
descriptorWrite.descriptorCount = 1;
|
||||||
|
descriptorWrite.pBufferInfo = &bufferInfo;
|
||||||
|
descriptorWrite.pImageInfo = nullptr;
|
||||||
|
descriptorWrite.pTexelBufferView = nullptr;
|
||||||
|
|
||||||
|
vkUpdateDescriptorSets(pimpl->device, 1, &descriptorWrite, 0, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
// get vertex attrib layout:
|
// get vertex attrib layout:
|
||||||
VkVertexInputBindingDescription bindingDescription{ };
|
VkVertexInputBindingDescription bindingDescription{ };
|
||||||
bindingDescription.binding = 0;
|
bindingDescription.binding = 0;
|
||||||
@ -1423,6 +1470,8 @@ namespace engine {
|
|||||||
vkDestroyPipeline(pimpl->device, pipeline->handle, nullptr);
|
vkDestroyPipeline(pimpl->device, pipeline->handle, nullptr);
|
||||||
vkDestroyPipelineLayout(pimpl->device, pipeline->layout, nullptr);
|
vkDestroyPipelineLayout(pimpl->device, pipeline->layout, nullptr);
|
||||||
|
|
||||||
|
vkDestroyDescriptorPool(pimpl->device, pipeline->descriptorPool, nullptr);
|
||||||
|
|
||||||
for (int i = 0; i < FRAMES_IN_FLIGHT; i++) {
|
for (int i = 0; i < FRAMES_IN_FLIGHT; i++) {
|
||||||
destroyBuffer(pipeline->uniformBuffers[i]);
|
destroyBuffer(pipeline->uniformBuffers[i]);
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ void Mesh::initMesh()
|
|||||||
|
|
||||||
void Mesh::drawMesh(const gfx::Pipeline* pipeline)
|
void Mesh::drawMesh(const gfx::Pipeline* pipeline)
|
||||||
{
|
{
|
||||||
gfx->drawIndexed(pipeline, vb, ib, m_indices.size());
|
gfx->draw(pipeline, vb, ib, m_indices.size(), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh::Mesh(GFXDevice* gfx, const std::vector<Vertex>& vertices) : Resource("", "mesh"), gfx(gfx)
|
Mesh::Mesh(GFXDevice* gfx, const std::vector<Vertex>& vertices) : Resource("", "mesh"), gfx(gfx)
|
||||||
|
Loading…
Reference in New Issue
Block a user