#pragma once #include "type.h" #include "asset/res/guid.h" #include "render/renderapi.h" #include "wrapper/commandbuffer.h" #include "backend.h" namespace vkn { class Backend; class VulkanWindow; struct MeshVAO; struct RenderPassKey; using api::Guid; using api::Mesh; using api::Shader; using api::RenderPassNode; using api::ResourceBarrierDesc; struct VulkanContext : public api::RenderContext { VkFence surfaceFence;; VkSemaphore surfaceSemaphore; VkSemaphore presentSemaphore; CommandBuffer command; }; class VULKAN_API VulkanAPI : public api::RenderAPI { private: VulkanWindow& window; Backend backend; table MeshTable; table RenderPassCache; public: VulkanAPI(); void Init() override; void Shutdown() override; void SetStaticMesh(Mesh& mesh)override; void DrawStaticMesh(Mesh& mesh)override; void LoadShader(Shader& shader)override; void BeginFrame()override; void EndFrame()override; void BeginRenderPass(RenderPassNode* node) override; void EndRenderPass(RenderPassNode* node) override; void ExecuteResourceBarriers(const ResourceBarrierDesc& desc) override; VkPipeline GetPipeline(); VkRenderPass GetRenderPass(RenderPassKey& config); Backend& GetBackend() { return backend; } static VulkanAPI* Ptr() { return (VulkanAPI*)api::RenderAPI::Ptr(); } }; }