#include "vkn/vulkan_api.h" #include "vkn/vulkan_window.h" #include "vkn/wrapper/buffer.h" #include "vkn/wrapper/device.h" #include "vkn/thread/buffer_worker.h" #include "vkn/thread/command_worker.h" #include "render/asset/mesh.h" namespace vkn { VulkanAPI::VulkanAPI() : RenderAPI(new VulkanContext()) , window(*VulkanWindow::Ptr()) , backend(VulkanEngineName) { } void VulkanAPI::Init() { } void VulkanAPI::Shutdown() { } void VulkanAPI::SetStaticMesh(Mesh& mesh) { auto& Indices = mesh.GetIndices(); auto& Vertices = mesh.GetVertices(); MeshVAO& VAO = MeshTable[mesh.GetGuid()]; VAO.indexCount = Indices.size(); VAO.vertexCount = Vertices.size(); Buffer indexBuffer{}; indexBuffer.ppBuffer = &VAO.indexBuffer; indexBuffer.pCpuData = Indices.data(); indexBuffer.size = sizeof(decltype(Indices[0])) * Indices.size(); indexBuffer.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT; Backend::TransferWorker->Invoke(indexBuffer); Buffer vertexBuffer{}; vertexBuffer.ppBuffer = &VAO.vertexBuffer; vertexBuffer.pCpuData = Vertices.data(); vertexBuffer.size = Vertices.data_size(); vertexBuffer.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT; Backend::TransferWorker->Invoke(vertexBuffer); } void VulkanAPI::DrawStaticMesh(Mesh& mesh) { } void VulkanAPI::LoadShader(Shader& shader) { } void VulkanAPI::BeginFrame() { window.Aquire(*(VulkanContext*)&context); } void VulkanAPI::EndFrame() { window.Present(*(VulkanContext*)&context); } VkRenderPass VulkanAPI::GetRenderPass(RenderPassKey config) { // Finally, create the VkRenderPass. VkRenderPassCreateInfo renderPassInfo{ .sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, .attachmentCount = 0u, .pAttachments = attachments, .subpassCount = hasSubpasses ? 2u : 1u, .pSubpasses = subpasses, .dependencyCount = hasSubpasses ? 1u : 0u, .pDependencies = dependencies }; VkRenderPass renderPass; VkResult error = vkCreateRenderPass(backend.GetDevice().Ptr(), &renderPassInfo, nullptr, &renderPass); } }