summaryrefslogtreecommitdiff
path: root/include/render
diff options
context:
space:
mode:
Diffstat (limited to 'include/render')
-rw-r--r--include/render/buffer.h19
-rw-r--r--include/render/mesh.h43
-rw-r--r--include/render/renderer.h107
-rw-r--r--include/render/shader.h25
-rw-r--r--include/render/util.h8
-rw-r--r--include/render/window.h32
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