Core

Vulkan core rendering primitives

#include <uhcgraphics.uhh>
#define UG_MATERIAL_MAX_RENDER_PASSES 4
#define UG_MATERIAL_MAX_TEXTURES 4

namespace UgContext {
  struct It {
      UgWindow.It window;
      VkInstance instance;
      VkDebugUtilsMessengerEXT logger;
      VkSurfaceKHR surface;
      VkPhysicalDevice physicalDevice;
      UgDevice.It device;
      VkDescriptorPool descriptorPool;
      VkCommandPool cmdPool;
  };
  UgContext.It create(UgWindow.It& window, U8 debug);
  U0 destroy(UgContext.It& ctx);
}

namespace UgInstance {
  VkInstance create(U8 debug);
  U0 destroy(UgContext.It& ctx);
}

namespace UgPhysicalDevice {
  VkPhysicalDeviceProperties getProperties(VkPhysicalDevice device);
  const I8* typeName(VkPhysicalDeviceType type);
  U8 hasExtensions(VkPhysicalDevice device);
  U32 count(VkInstance instance);
  U0 list(VkInstance instance);
  VkPhysicalDevice get(VkInstance instance, VkSurfaceKHR surface, U8 desiredType);
  VkPhysicalDevice create(VkInstance instance, VkSurfaceKHR surface);
}

namespace UgQueueFamilies {
  U32 count(VkPhysicalDevice device);
  U8 hasType(VkPhysicalDevice device, VkQueueFlagBits type);
  U32 getType(VkPhysicalDevice device, VkQueueFlagBits type);
}

namespace UgDevice {
  struct It {
      VkDevice handle;
      VkPhysicalDeviceProperties properties;
      VkQueue graphicQueue;
      VkQueue presentQueue;
  };
  VkQueue getQueue(VkPhysicalDevice device, VkDevice logicalDevice, VkQueueFlagBits queueType);
  VkQueue getPresentationQueue(VkPhysicalDevice device, VkSurfaceKHR surface, VkDevice logicalDevice);
  U32 getSurfaceSupport(VkPhysicalDevice device, VkSurfaceKHR surface);
  U0 destroy(UgDevice.It& device);
  VkDevice make(VkPhysicalDevice device, VkSurfaceKHR surface);
  UgDevice.It create(VkPhysicalDevice device, VkSurfaceKHR surface);
}

namespace UgBuffer {
  struct It {
      VkBuffer handle;
      VkDeviceMemory memory;
  };
  UgBuffer.It create(UgContext.It& ctx, U32 size, VkBufferUsageFlagBits usage);
  U0 upload(UgContext.It& ctx, UgBuffer.It& buffer, U0* data, U32 size);
  U0 destroy(UgContext.It& ctx, UgBuffer.It& buffer);
}

namespace UgFrameBuffer {
  struct It {
      VkFramebuffer* handles;
      VkExtent2D extends;
      U32 bufferCount;
  };
  U0 destroy(UgContext.It& ctx, UgFrameBuffer.It& framebuffers);
  UgFrameBuffer.It create(UgContext.It& ctx, UgSwapchain.It& swapchain, VkRenderPass renderPass);
}

namespace UgUniformBuffer {
  struct It {
      UgBuffer.It buffer;
      VkDescriptorSetLayout setLayout;
      U0* mappedData;
      U32 binding;
      U32 size;
      VkDescriptorSet descriptorSet;
      U32 cursor;
  };
  UgUniformBuffer.It create(UgContext.It& ctx, U32 binding, U32 size);
  U0 bind(UgUniformBuffer.It& uniformBuffer, VkCommandBuffer cmdBuffer, VkPipelineLayout pipelineLayout);
  U0 destroy(UgContext.It& ctx, UgUniformBuffer.It& uniformBuffer);
  U0 reset(UgUniformBuffer.It& uniformBuffer);
  U0 setFloat(UgUniformBuffer.It& buffer, F32 value);
  U0 setVec2f(UgUniformBuffer.It& buffer, VectorF.It vec);
  U0 setVec3f(UgUniformBuffer.It& buffer, VectorF.It vec);
  U0 setVec4f(UgUniformBuffer.It& buffer, VectorF.It vec);
  U0 setMat(UgUniformBuffer.It& buffer, Matrix.It mat);
}

namespace UgCommandBuffer {
  struct It {
      VkCommandBuffer handle;
  };
  U0 begin(UgCommandBuffer.It& cmd);
  U0 end(UgCommandBuffer.It& cmd);
  U0 destroy(UgContext.It& ctx, UgCommandBuffer.It& cmd);
  UgCommandBuffer.It create(UgContext.It& ctx);
}

namespace UgCommandPool {
  U0 destroy(UgContext.It& ctx, VkCommandPool cmdPool);
  VkCommandPool create(UgContext.It& ctx);
}

namespace UgDescriptorPool {
  VkDescriptorPool create(UgContext.It& ctx);
  U0 destroy(UgContext.It& ctx, VkDescriptorPool descriptorPool);
}

namespace UgFence {
  struct It {
      VkFence handle;
  };
  UgFence.It create(UgContext.It& ctx);
  U0 destroy(UgContext.It& ctx, UgFence.It& fence);
  U0 wait(UgContext.It& ctx, UgFence.It& fence);
  U0 reset(UgContext.It& ctx, UgFence.It& fence);
}

namespace UgSemaphore {
  struct It {
      VkSemaphore handle;
  };
  UgSemaphore.It create(UgContext.It& ctx);
  U0 destroy(UgContext.It& ctx, UgSemaphore.It& semaphore);
}

namespace UgImageView {
  struct It {
      VkImage image;
      VkImageView view;
  };
  UgImageView.It create(UgContext.It& ctx, VkImage image, VkFormat format);
  U0 destroy(UgContext.It& ctx, UgImageView.It& imageView);
  VkImageView makeView(UgContext.It& ctx, VkImage image, VkFormat format, VkImageAspectFlags aspectMask);
}

namespace UgImageLayout {
  U0 transition(VkCommandBuffer cmdBuffer, VkImage image, VkFormat format, VkImageLayout oldLayout, VkImageLayout newLayout);
}

namespace UgWindowSurface {
  U0 destroy(VkInstance instance, VkSurfaceKHR surface);
  VkSurfaceKHR create(VkInstance instance, UgWindow.It& window);
}

namespace UgSwapchain {
  struct It {
      VkSwapchainKHR handle;
      UgImageView.It* imageViews;
      U32 imageCount;
      U32 currentFrame;
      U32 imageIndex;
      UgSemaphore.It* pSemaphore;
      UgSemaphore.It* rSemaphore;
      VkSurfaceFormatKHR surfaceFormat;
      VkPresentModeKHR presentMode;
      VkSurfaceCapabilitiesKHR capabilities;
      VkImage depthImage;
      VkDeviceMemory depthImageMemory;
      VkImageView depthImageView;
  };
  VkExtent2D extend(UgContext.It& ctx, UgSwapchain.It& swapchain);
  U0 update(UgContext.It& ctx, UgSwapchain.It& swapchain, VkCommandBuffer cmdBuffer);
  U0 destroy(UgContext.It& ctx, UgSwapchain.It& swapchain);
  UgSwapchain.It create(UgContext.It& ctx);
}

namespace UgShader {
  U0 destroy(UgContext.It& ctx, VkShaderModule shader);
  VkShaderModule create(UgContext.It& ctx, const I8* filePath);
}

namespace UgShaderProgram {
  struct It {
      VkPipelineShaderStageCreateInfo handle[2];
      VkShaderModule vertexShader;
      VkShaderModule fragmentShader;
  };
  VkPipelineShaderStageCreateInfo createShaderInfo(VkShaderStageFlagBits stage, VkShaderModule shader);
  UgShaderProgram.It create(UgContext.It& ctx, const I8* vertexSource, const I8* fragmentSource);
  U0 destroy(UgContext.It& ctx, UgShaderProgram.It& shaderProgram);
}

namespace UgRenderPass {
  U0 end(VkCommandBuffer cmdBuffer);
  U0 begin(VkRenderPass renderPass, UgFrameBuffer.It& framebuffers, VkCommandBuffer cmdBuffer, U32 imageIndex);
  U0 destroy(UgContext.It& ctx, VkRenderPass renderPass);
  VkRenderPass create(UgContext.It& ctx, UgSwapchain.It& swapchain);
}

namespace UgRenderTarget {
  struct It {
      VkRenderPass renderPass;
      VkFramebuffer framebuffer;
      UgTexture.It texture;
      U32 width;
      U32 height;
  };
  UgRenderTarget.It create(UgContext.It& ctx, U32 width, U32 height);
  U0 begin(UgRenderTarget.It& rt, UgCommandBuffer.It& cmd);
  U0 end(UgCommandBuffer.It& cmd);
  U0 setViewport(UgRenderTarget.It& rt, UgCommandBuffer.It& cmd);
  U0 destroy(UgContext.It& ctx, UgRenderTarget.It& rt);
}

namespace UgRenderer {
  struct It {
      UgSwapchain.It swapchain;
      UgFrameBuffer.It framebuffers;
      VkRenderPass renderPass;
  };
  UgRenderer.It create(UgContext.It& ctx);
  U0 destroy(UgContext.It& ctx, UgRenderer.It& renderer);
  U0 update(UgContext.It& ctx, UgRenderer.It& renderer);
  U0 begin(UgRenderer.It& renderer, UgCommandBuffer.It& cmd);
  U0 end(UgCommandBuffer.It& cmd);
  U0 setViewport(UgContext.It& ctx, UgRenderer.It& renderer, UgCommandBuffer.It& cmd);
  U0 submit(UgContext.It& ctx, UgRenderer.It& renderer, UgCommandBuffer.It& cmd, UgFence.It& fence);
  VkResult present(UgContext.It& ctx, UgRenderer.It& renderer);
  VkResult aquire(UgContext.It& ctx, UgRenderer.It& renderer);
}

namespace UgPipeline {
  VkPipelineDynamicStateCreateInfo createDynamicState();
  VkPipelineInputAssemblyStateCreateInfo createInputAssembly();
  VkViewport createViewport(UgContext.It& ctx, UgSwapchain.It& swapchain);
  VkRect2D createScissor(UgContext.It& ctx, UgSwapchain.It& swapchain);
  VkPipelineViewportStateCreateInfo createViewportState(VkViewport* viewport, VkRect2D* scissor);
  VkPipelineRasterizationStateCreateInfo createRasterizerState(const UgVertexSettings.It& settings);
  VkPipelineMultisampleStateCreateInfo createMultisamplingState();
  VkPipelineColorBlendAttachmentState createColorBlendAttachmentState(const UgVertexSettings.It& settings);
  VkPipelineColorBlendStateCreateInfo createColorBlendState(VkPipelineColorBlendAttachmentState* colorBlendAttachment);
  U0 destroy(UgContext.It& ctx, VkPipeline graphicsPipeline);
  VkPipeline create(UgContext.It& ctx, VkPipelineLayout layout, UgSwapchain.It& swapchain, UgShaderProgram.It& shaderProgram, VkRenderPass renderPass, VkPipelineVertexInputStateCreateInfo* vertexInput, const UgVertexSettings.It& settings);
  VkPipelineDepthStencilStateCreateInfo createDepthStencil();
}

namespace UgPipelineLayout {
  U0 remove(UgContext.It& ctx, VkPipelineLayout layout);
  U0 destroy(UgContext.It& ctx, VkPipelineLayout pipelineLayout);
  VkPipelineLayout create(UgContext.It& ctx, U32 count, VkDescriptorSetLayout* setLayouts);
}

namespace UgMaterialPipelineEntry {
  struct It {
      VkRenderPass renderPass;
      VkPipeline   pipeline;
  };
}

namespace UgMaterial {
  struct It {
      VkPipelineLayout layout;
      VkDescriptorSetLayout textureSetLayouts[UG_MATERIAL_MAX_TEXTURES];
      UgShaderProgram.It shaderProgram;
      UgVertexDesc.It    vertexDesc;
      UgVertexSettings.It settings;
      U32 textureCount;
      UgMaterialPipelineEntry.It pipelineCache[UG_MATERIAL_MAX_RENDER_PASSES];
      U32 pipelineCacheCount;
      UgContext.It*   ctx;
      UgSwapchain.It* swapchain;
  };
  U0 destroy(UgContext.It& ctx, UgMaterial.It& mat);
}

namespace UgTexture {
  struct It {
      VkImage image;
      VkDeviceMemory memory;
      VkImageView view;
      VkSampler sampler;
      VkDescriptorSetLayout setLayout;
      VkDescriptorSet descriptorSet;
  };
  UgTexture.It create(UgContext.It& ctx, const I8* path);
  VkDescriptorSetLayout createSetLayout(UgContext.It& ctx);
  U0 bind(UgTexture.It& texture, UgCommandBuffer.It& cmd, VkPipelineLayout pipelineLayout, U32 slot);
  U0 destroy(UgContext.It& ctx, UgTexture.It& texture);
}

namespace UgSampler {
  VkSampler create(UgContext.It& ctx);
  U0 destroy(UgContext.It& ctx, VkSampler sampler);
}

namespace UgTextureArray {
  struct It {
      VkImage image;
      VkDeviceMemory memory;
      VkImageView view;
      VkSampler sampler;
      VkDescriptorSetLayout setLayout;
      VkDescriptorSet descriptorSet;
      U32 layerCount;
  };
  UgTextureArray.It create(UgContext.It& ctx, const I8** paths, U32 count);
  U0 bind(UgTextureArray.It& arr, UgCommandBuffer.It& cmd, VkPipelineLayout pipelineLayout, U32 slot);
  U0 destroy(UgContext.It& ctx, UgTextureArray.It& arr);
}

namespace UgVertexAttrib {
  struct It {
      U32 location;
      VkFormat format;
      U32 offset;
  };
}

namespace UgVertexDesc {
  struct It {
      U32 stride;
      UgVertexAttrib.It* attributes;
      U32 attributeCount;
  };
}

namespace UgVertexSettings {
  struct It {
      U8 depthVao;
      I32 colorWriteMask;
      VkBool32 blendEnable;
      VkBlendFactor srcColorBlendFactor;
      VkBlendFactor dstColorBlendFactor;
      VkBlendOp colorBlendOp;
      VkBlendFactor srcAlphaBlendFactor;
      VkBlendFactor dstAlphaBlendFactor;
      VkBlendOp alphaBlendOp;
      VkBool32 depthClampEnable;
      VkBool32 rasterizerDiscardEnable;
      VkPolygonMode polygonMode;
      VkCullModeFlagBits cullMode;
      VkFrontFace frontFace;
      VkBool32 depthBiasEnable;
      F32 depthBiasConstantFactor;
      F32 depthBiasClamp;
      F32 depthBiasSlopeFactor;
      F32 lineWidth;
  };
}