#ifndef PKE_WINDOW_HPP #define PKE_WINDOW_HPP #include "asset-manager.hpp" #include "window-types.hpp" #include "pk.h" #include "vendor-glm-include.hpp" #include #include // TODO replace me with something more elegant extern uint32_t swapchainLength; extern uint32_t prevSwapchainLength; extern struct pk_membucket *MemBkt_Vulkan; extern bool shouldRecreateSwapchain; extern pk_ev_mgr_id_T pke_ev_mgr_id_window; extern pk_ev_id_T pke_ev_id_framebuffer_length_changed; extern GLFWwindow *window; extern GLFWmonitor *monitor; extern GLFWvidmode vidMode; extern VkInstance vkInstance; extern VkPhysicalDevice vkPhysicalDevice; extern VkPhysicalDeviceProperties vkPhysicalDeviceProperties; extern VkSurfaceKHR vkSurfaceKHR; extern VkFormat depthFormat; extern VkDevice vkDevice; extern VkAllocationCallbacks *vkAllocator; extern unsigned int graphicsFamilyIndex; extern unsigned int presentFamilyIndex; extern unsigned int transferFamilyIndex; extern VkRenderPass presentRenderPass; extern VkRenderPass renderRenderPass; extern VkSampler global_sampler; extern VkSampleCountFlagBits global_sample_count; struct UniformBufferObject { glm::mat4 model; glm::mat4 view; glm::mat4 proj; }; extern UniformBufferObject UBO; extern VkBuffer *UniformBuffers; extern VkExtent2D Extent; struct DebugHitbox { VkImage vkImage = VK_NULL_HANDLE; VkImageView vkImageView = VK_NULL_HANDLE; VkDeviceMemory textureMemory = VK_NULL_HANDLE; VkDeviceMemory vertBufferMemory = VK_NULL_HANDLE; VkBuffer vertexBuffer; VkBuffer normalsBuffer; VkBuffer uvBuffer; VkBuffer indexBuffer; VkBuffer instanceBuffer = VK_NULL_HANDLE; uint32_t indexCount = 0; uint32_t instanceCount = 1; uint32_t instanceStartingIndex = 0; VkDescriptorPool vkDescriptorPool; VkDescriptorSet *vkDescriptorSets = nullptr; }; extern DebugHitbox pkeDebugHitbox; struct ImplementedPKVK { struct ImplementedDescrSetLayouts { struct ImplementedDescrSetLayoutsByName { // 0 bindings VkDescriptorSetLayout base; // 1 binding, texture sampler VkDescriptorSetLayout txtr; // 2 bindings, ubo + texture sampler VkDescriptorSetLayout ubo_txtr; } named; } descr_layouts; struct ImplementedPipelineLayouts { struct ImplementedPipelineLayoutsByName { VkPipelineLayout base; VkPipelineLayout txtr; VkPipelineLayout ubo_txtr; } named; } pipe_layouts; struct ImplementedPipelines { struct ImplementedPipelinesByName { VkPipeline entity_standard; VkPipeline entity_wireframe; VkPipeline font_glyph; VkPipeline ui_base; VkPipeline ui_txtr; } named; } pipelines; }; extern ImplementedPKVK pkePipelines; void CreateWindow(PKEWindowProperties wp); void DestroyWindow(); VkShaderModule UploadShader(AssetHandle handle); void window_tick_late(double delta); void Render(); unsigned int FindMemoryTypeIndex(uint32_t typeFilter, VkMemoryPropertyFlags memPropertyFlags); void CalculateCombinedMemReqs(uint64_t memReqsCount, VkMemoryRequirements *memReqs, VkMemoryRequirements &combinedMemReqs); enum PKVK_TmpBufferFlags : uint8_t { PKVK_TmpBufferFlags_NONE = 0, PKVK_TmpBufferFlags_MAP_MEMORY = 1, PKVK_TmpBufferFlags_ALL = 0xFF, }; struct PKVK_TmpBufferDetails { VkQueue queue = VK_NULL_HANDLE; VkCommandBuffer cmdBuffer = VK_NULL_HANDLE; VkBuffer buffer = VK_NULL_HANDLE; VkDeviceMemory deviceMemory = VK_NULL_HANDLE; void *deviceData = nullptr; }; void PKVK_BeginBuffer(unsigned int family_index, VkDeviceSize requestedMemorySize, PKVK_TmpBufferDetails &tmpBufferDetails, PKVK_TmpBufferFlags flags = PKVK_TmpBufferFlags_ALL); void PKVK_EndBuffer(PKVK_TmpBufferDetails &tmpBufferDetails, PKVK_TmpBufferFlags flags = PKVK_TmpBufferFlags_ALL); #define PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH 8 struct pkvk_buffer_create_data { uint32_t buffer_byte_length[PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH]; void *src_data[PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH]; uint8_t n_buffers; uint8_t index_index; uint8_t index_instance; }; struct pkvk_buffer_create_data_out { VkBuffer buffers[PKVK_BUFFER_CREATE_DATA_ARR_MAX_LENGTH]; VkDeviceMemory device_memory_vertex; VkDeviceMemory device_memory_instance; VkMemoryRequirements memory_requirements_vertex; VkMemoryRequirements memory_requirements_instance; }; // creates vertex and instance buffers + memory + bind // DOES upload vertex data // DOES NOT upload instance data void pkvk_buffer_create(pkvk_buffer_create_data *data, pkvk_buffer_create_data_out *out); #define PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH 8 struct pkvk_texture_upload_data { const Asset *texture_assets[PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH]; uint8_t n_textures; }; struct pkvk_texture_upload_data_out { VkImage images[PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH]; VkImageView image_views[PKVK_TEXTURE_UPLOAD_ARR_MAX_LENGTH]; VkDeviceMemory device_memory; }; void pkvk_texture_upload(pkvk_texture_upload_data *data, pkvk_texture_upload_data_out *out); void pkvk_texture_upload_array(pkvk_texture_upload_data *data, pkvk_texture_upload_data_out *out); void pkvk_queue_vk_image_view_destroy(VkImageView image_view); void pkvk_queue_vk_image_destroy(VkImage image); void pkvk_queue_vk_buffer_destroy(VkBuffer buffer); void pkvk_queue_vk_memory_free(VkDeviceMemory memory); void pkvk_queue_vk_descriptor_pool_destroy(VkDescriptorPool descriptor_pool); #endif /* PKE_WINDOW_HPP */