# HG changeset patch # User John Tsiombikas # Date 1530183448 -10800 # Node ID 8de4fe9268823c6f3ac894531a91bee555352217 initial commit diff -r 000000000000 -r 8de4fe926882 .hgignore --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/.hgignore Thu Jun 28 13:57:28 2018 +0300 @@ -0,0 +1,5 @@ +\.o$ +\.swp$ +\.d$ +\.spv$ +^test$ diff -r 000000000000 -r 8de4fe926882 Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Makefile Thu Jun 28 13:57:28 2018 +0300 @@ -0,0 +1,21 @@ +src = $(wildcard src/*.c) +obj = $(src:.c=.o) +bin = test + +def = -DGLFW_INCLUDE_VULKAN + +CFLAGS = -pedantic -Wall -g $(def) +LDFLAGS = -lvulkan -lglfw + +$(bin): $(obj) vertex.spv pixel.spv + $(CC) -o $@ $(obj) $(LDFLAGS) + +vertex.spv: vertex.glsl + glslangValidator -o $@ -S vert -V $< + +pixel.spv: pixel.glsl + glslangValidator -o $@ -S frag -V $< + +.PHONY: clean +clean: + rm -f $(obj) $(bin) *.spv diff -r 000000000000 -r 8de4fe926882 pixel.glsl --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pixel.glsl Thu Jun 28 13:57:28 2018 +0300 @@ -0,0 +1,10 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable + +layout(location = 0) in vec3 incol; +layout(location = 0) out vec4 outcol; + +void main() +{ + outcol = vec4(incol, 1.0); +} diff -r 000000000000 -r 8de4fe926882 src/main.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main.c Thu Jun 28 13:57:28 2018 +0300 @@ -0,0 +1,748 @@ +#include +#include +#include +#include +#include +#include +#include + +void keyb(GLFWwindow *win, int key, int sc, int act, int mods); +int init(void); +void destroy(void); +void draw(void); + +GLFWwindow *win; +int win_width = 800; +int win_height = 600; +int redraw_pending; + +int main(void) +{ + if(!glfwInit()) { + fprintf(stderr, "glfw init failed\n"); + return 1; + } + + glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); + win = glfwCreateWindow(win_width, win_height, "test", 0, 0); + glfwSetKeyCallback(win, keyb); + + if(init() == -1) { + glfwDestroyWindow(win); + glfwTerminate(); + return 1; + } + + redraw_pending = 1; + + while(!glfwWindowShouldClose(win)) { + glfwWaitEvents(); + + if(redraw_pending) { + redraw_pending = 0; + draw(); + } + } + + destroy(); + glfwDestroyWindow(win); + glfwTerminate(); + return 0; +} + +void keyb(GLFWwindow *win, int key, int sc, int act, int mods) +{ + if(act == GLFW_PRESS) { + switch(key) { + case GLFW_KEY_ESCAPE: + glfwSetWindowShouldClose(win, 1); + break; + } + } +} + +/* -------------------------------------------------------------- */ +int create_instance(void); +int create_surface(void); +int choose_phys_dev(void); +int create_device(void); +int create_swapchain(void); +int create_imgviews(void); +int create_rendpass(void); +int create_pipeline(void); +int create_framebuf(void); +int create_cmdpool(void); +int create_cmdbuf(void); +int create_semaphores(void); +VkShaderModule load_shader(const char *fname); + +VkInstance vk; +VkPhysicalDevice vkpdev; +int vkqfam_idx = -1; +VkDevice vkdev; +VkQueue vkq; +VkSurfaceKHR vksurf; +VkSurfaceCapabilitiesKHR vksurf_caps; +int vksurf_numfmt, vksurf_selfmt; +VkSurfaceFormatKHR *vksurf_fmt; +VkSwapchainKHR vksc; +int vksc_numimg; +VkImage *vksc_img; +VkExtent2D vksc_extent; +VkImageView *vksc_view; +VkRenderPass vkrpass; +VkPipelineLayout vkpipe_layout; +VkPipeline vkpipe; +VkFramebuffer *vksc_fb; +VkCommandPool vkcmdpool; +VkCommandBuffer *vksc_cmdbuf; +VkSemaphore sem_gotimg, sem_drawdone; + +int init(void) +{ + if(create_instance() == -1) return -1; + if(create_surface() == -1) return -1; + if(choose_phys_dev() == -1) return -1; + if(create_device() == -1) return -1; + if(create_swapchain() == -1) return -1; + if(create_imgviews() == -1) return -1; + if(create_rendpass() == -1) return -1; + if(create_pipeline() == -1) return -1; + if(create_framebuf() == -1) return -1; + if(create_cmdpool() == -1) return -1; + if(create_cmdbuf() == -1) return -1; + if(create_semaphores() == -1) return -1; + return 0; +} + +void destroy(void) +{ + int i; + + if(sem_gotimg) vkDestroySemaphore(vkdev, sem_gotimg, 0); + if(sem_drawdone) vkDestroySemaphore(vkdev, sem_drawdone, 0); + if(vkcmdpool) vkDestroyCommandPool(vkdev, vkcmdpool, 0); + if(vksc_fb) { + for(i=0; i