diff options
Diffstat (limited to 'include/render')
-rw-r--r-- | include/render/buffer.h | 19 | ||||
-rw-r--r-- | include/render/mesh.h | 43 | ||||
-rw-r--r-- | include/render/renderer.h | 107 | ||||
-rw-r--r-- | include/render/shader.h | 25 | ||||
-rw-r--r-- | include/render/util.h | 8 | ||||
-rw-r--r-- | include/render/window.h | 32 |
6 files changed, 234 insertions, 0 deletions
diff --git a/include/render/buffer.h b/include/render/buffer.h new file mode 100644 index 0000000..7a203b7 --- /dev/null +++ b/include/render/buffer.h @@ -0,0 +1,19 @@ +#ifndef _RENDER_BUFFER_H_ +#define _RENDER_BUFFER_H_ + +#include <vulkan/vulkan.h> + +struct renderer; +struct buffer { + VkBuffer buffer; + VkDeviceMemory memory; +}; + +VkResult buffer_create(struct renderer *ren, VkDeviceSize size, + VkBufferUsageFlags usage, VkMemoryPropertyFlags props, struct buffer *buf); +void buffer_destroy(struct renderer *ren, struct buffer *buf); +VkResult create_image(struct renderer *ren, VkExtent2D extent, uint32_t mip_level, VkFormat format, VkImageTiling tiling, + VkImageUsageFlags usage, VkMemoryPropertyFlags props, VkImage *img, VkDeviceMemory *memory); +VkResult create_image_view(VkDevice gpu, VkImage image, VkFormat format, VkImageAspectFlags flags, VkImageView *view); + +#endif diff --git a/include/render/mesh.h b/include/render/mesh.h new file mode 100644 index 0000000..aed4836 --- /dev/null +++ b/include/render/mesh.h @@ -0,0 +1,43 @@ +#ifndef _RENDER_MESH_H_ +#define _RENDER_MESH_H_ + +#include <vulkan/vulkan.h> +#include <stdint.h> +#include "render/buffer.h" + +#include "linmath.h" + +struct renderer; + +struct vec3 { + float x, y, z; +}; + +struct vec4 { + float x, y, z, w; +}; + +struct ubo { + mat4x4 model; + mat4x4 view; + mat4x4 proj; +}; + +struct vertex { + struct vec3 position; + struct vec3 normal; + struct vec4 color; +}; + +struct mesh { + struct buffer vertex; + struct buffer index; + mat4x4 position; + size_t index_count; +}; + +struct mesh upload_mesh(struct renderer *ren, size_t vertex_count, struct vertex vertices[vertex_count], + size_t index_count, uint32_t indices[index_count], struct vec3 position); +void mesh_destroy(struct renderer *ren, struct mesh *mesh); + +#endif diff --git a/include/render/renderer.h b/include/render/renderer.h new file mode 100644 index 0000000..bae799d --- /dev/null +++ b/include/render/renderer.h @@ -0,0 +1,107 @@ +#ifndef _RENDER_H_ +#define _RENDER_H_ + +#include <vulkan/vulkan.h> +#include <sys/types.h> +#include "render/window.h" +#include "render/buffer.h" +#include "render/shader.h" +#include "render/mesh.h" + +#define MAX_FRAMES 2 + +struct image { + VkImage image; + VkDeviceMemory memory; + VkImageView view; +}; + +struct renderer { + struct window *win; + VkInstance instance; + VkSurfaceKHR surface; + + struct { + uint32_t cap, len; + struct phy_gpu { + VkPhysicalDevice gpu; + size_t graphics_queue; + size_t present_queue; + struct surface_caps { + VkSurfaceCapabilitiesKHR caps; + struct { + uint32_t len; + VkSurfaceFormatKHR *data; + } formats; + struct { + uint32_t len; + VkPresentModeKHR *data; + } present_modes; + } surface_caps; + } *gpus; + struct phy_gpu *chosen; + } phy_gpus; + + struct { + VkDevice device; + VkQueue gfx_queue; + VkQueue present_queue; + } gpu; + + struct { + VkSwapchainKHR swapchain; + VkFormat format; + VkExtent2D extent; + struct { + uint32_t len; + struct { + VkImage image; + VkImageView view; + VkFramebuffer framebuffer; + } *data; + } images; + } swapchain; + + VkRenderPass render_pass; + + struct { + VkCommandPool pool; + VkCommandBuffer buffers[MAX_FRAMES]; + } command; + + struct { + VkPipelineLayout layout; + VkPipeline gfx; + } pipeline; + + struct { + VkSemaphore image_available[MAX_FRAMES]; + VkSemaphore render_finished[MAX_FRAMES]; + VkFence in_flight[MAX_FRAMES]; + } locks; + + struct { + VkDescriptorSetLayout layout; + VkDescriptorPool pool; + VkDescriptorSet sets[MAX_FRAMES]; + } descriptor; + + struct image depth; + struct { + struct buffer buffer; + void *data; + } uniform[MAX_FRAMES]; + + VkSampler sampler; + VkSampleCountFlagBits msaa_samples; + + uint32_t mip_levels; + uint32_t current_frame; +}; + +struct renderer *renderer_init(struct window *win); +void renderer_destroy(struct renderer *ren); +void renderer_draw(struct renderer *ren, size_t mesh_count, struct mesh meshes[mesh_count]); +void renderer_resize(struct renderer *ren); + +#endif diff --git a/include/render/shader.h b/include/render/shader.h new file mode 100644 index 0000000..0e827df --- /dev/null +++ b/include/render/shader.h @@ -0,0 +1,25 @@ +#ifndef _RENDER_SHADER_H_ +#define _RENDER_SHADER_H_ + +#include <stdbool.h> +#include <vulkan/vulkan.h> + +struct renderer; + +struct shader { + size_t len; + uint8_t *code; + VkShaderStageFlagBits stage; +}; + +struct shader_input { + size_t desc_count; + VkVertexInputBindingDescription *descs; + size_t attr_count; + VkVertexInputAttributeDescription *attrs; +}; + +VkResult shader_create_module(struct renderer *ren, const size_t len, uint8_t code[len], VkShaderModule *module); +bool shader_load(const char *filename, struct shader *shader); + +#endif diff --git a/include/render/util.h b/include/render/util.h new file mode 100644 index 0000000..d7215f8 --- /dev/null +++ b/include/render/util.h @@ -0,0 +1,8 @@ +#ifndef _RENDER_UTIL_H_ +#define _RENDER_UTIL_H_ + +#include <vulkan/vulkan.h> + +VkResult create_image_view(VkDevice gpu, VkImage image, VkFormat format, VkImageAspectFlags flags, VkImageView *view); + +#endif diff --git a/include/render/window.h b/include/render/window.h new file mode 100644 index 0000000..3ec9a12 --- /dev/null +++ b/include/render/window.h @@ -0,0 +1,32 @@ +#ifndef _WINDOW_H_ +#define _WINDOW_H_ + +#include <wayland-client.h> +#include <vulkan/vulkan.h> +#include <vulkan/vulkan_wayland.h> +#include <stdbool.h> +#include "xdg-shell-protocol.h" +#include "xdg-decoration-unstable-v1-protocol.h" + +struct window { + const char *title; + + struct wl_display *dpy; + struct wl_registry *reg; + struct wl_compositor *comp; + struct zxdg_decoration_manager_v1 *deco_manager; + struct zxdg_toplevel_decoration_v1 *deco; + struct wl_surface *surface; + struct xdg_wm_base *xdg_base; + struct xdg_surface *xdg_surface; + struct xdg_toplevel *xdg_toplevel; + + int32_t width, height; + bool resize, should_close; +}; + +struct window *window_init(const char *title); +void window_destroy(struct window *win); +VkSurfaceKHR window_create_vk_surface(VkInstance instance, struct window *win); + +#endif |