Commit acc9ebc
Changed files (9)
libgogvk/gogerr.h
@@ -0,0 +1,18 @@
+
+#define GET_GOG_RESULT(status_,code_)\
+ ((gog_result){.status = status_, .err_code =code_})
+
+#define GOG_ERR_MISMATCH 0x2
+
+typedef enum
+{
+ GOG_SUCCES=1,
+ GOG_FAIL=0
+}gog_err;
+
+
+typedef struct
+{
+ gog_err status;
+ int err_code;
+}gog_result;
libgogvk/gogvid.c
@@ -0,0 +1,177 @@
+#include "gogvid.h"
+#include <SDL2/SDL_video.h>
+#include <SDL2/SDL_vulkan.h>
+#include <stdlib.h>
+#include <string.h>
+#include <vulkan/vulkan_core.h>
+
+gog_result gog_graphics_init(gog_graphics_hndl *gh)
+{
+ struct gog_vk_ext extensions;
+ //open window
+ gog_open_sdl_window(gh->sdl_window_p,&extensions);
+ //get instance
+ gog_vulkan_init(&gh->vk_instance, extensions, 0);
+ //get surface
+ SDL_Vulkan_CreateSurface(gh->sdl_window_p, gh->vk_instance, &gh->vk_surface);
+ //get phizical device
+ //gog_get_physical_device(gh, extensions, VK_QUEUE_GRAPHICS_BIT);
+ //get logical device plus queues
+ //gog_get_logical_device();
+ //swapchain
+ //load shaders into memory
+ //create pipelines
+ //framebuffer
+ //command buffer
+ //uniforms
+ //descriptor sets / texture loading
+
+ return GET_GOG_RESULT(GOG_SUCCES, 0);
+}
+
+gog_result gog_graphics_update(int flags)
+{
+
+
+ return GET_GOG_RESULT(GOG_SUCCES, 0);
+}
+
+gog_result gog_graphics_render_frame()
+{
+
+
+ return GET_GOG_RESULT(GOG_SUCCES, 0);
+}
+
+gog_result gog_open_sdl_window(SDL_Window * window, struct gog_vk_ext * extensions)
+{
+ window = SDL_CreateWindow(GOG_WINDOW_TITLE, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, GOG_WINDOW_REZ_WIDTH, GOG_WINDOW_REZ_HEIGHT,SDL_WINDOW_VULKAN);
+ unsigned int sdl_extension_count;
+ SDL_Vulkan_GetInstanceExtensions(window , &sdl_extension_count,NULL);
+ const char ** sdl_extensions = malloc(sdl_extension_count*sizeof(char*));
+ SDL_Vulkan_GetInstanceExtensions(window , &sdl_extension_count, sdl_extensions);
+ extensions->vk_ext_count = sdl_extension_count;
+ extensions->vk_ext_pp = sdl_extensions;
+ return GET_GOG_RESULT(GOG_SUCCES,0);
+}
+
+gog_result gog_vulkan_init(VkInstance * instance, struct gog_vk_ext extensions, int flags)
+{
+ const char * layers[] = {0};//{"VK_LAYER_KHRONOS_validation"};
+ const int layer_count = 0;
+
+ VkApplicationInfo app_ci={0};
+ app_ci.sType=VK_STRUCTURE_TYPE_APPLICATION_INFO;
+ app_ci.pNext=NULL;
+ app_ci.apiVersion=VK_API_VERSION_1_3;
+ app_ci.pEngineName=GOG_ENGINE_NAME;
+ app_ci.pApplicationName=GOG_APPLICATION_NAME;
+ app_ci.engineVersion=0;
+ app_ci.applicationVersion=0;
+
+ VkInstanceCreateInfo instance_ci={0};
+ instance_ci.sType=VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
+ instance_ci.pNext=NULL;
+ instance_ci.pApplicationInfo=&app_ci;
+ instance_ci.enabledLayerCount=0;
+ instance_ci.ppEnabledLayerNames=&layers[0];
+ instance_ci.enabledExtensionCount=extensions.vk_ext_count;
+ instance_ci.ppEnabledExtensionNames=extensions.vk_ext_pp;
+
+ VkResult result=vkCreateInstance(&instance_ci , 0, instance);
+ free(extensions.vk_ext_pp);
+ if(result!=VK_SUCCESS)
+ {
+ return GET_GOG_RESULT(GOG_FAIL,result);
+ }
+ return GET_GOG_RESULT(GOG_SUCCES,result);
+}
+
+gog_result gog_device_init(gog_graphics_hndl *gh, struct gog_vk_ext gog_ext, int queue_flags)
+{
+ unsigned int gpu_num;
+ VkPhysicalDeviceProperties gpu_prop;
+ vkEnumeratePhysicalDevices(gh->vk_instance,&gpu_num,NULL);
+ VkPhysicalDevice gpu_list[gpu_num];
+ vkEnumeratePhysicalDevices(gh->vk_instance,&gpu_num,gpu_list);
+ for(int i=0;i<gpu_num;i++)
+ {
+ vkGetPhysicalDeviceProperties(gpu_list[i],&gpu_prop);
+ uint32_t extension_count=0;
+ vkEnumerateDeviceExtensionProperties(gpu_list[i],NULL,&extension_count,NULL);
+ VkExtensionProperties extensions[extension_count];
+ vkEnumerateDeviceExtensionProperties(gpu_list[i],NULL,&extension_count,&extensions[0]);
+ if(gog_verify_device_extensions(gog_ext,extensions,extension_count).status == GOG_FAIL)
+ {
+ continue;
+ }
+ uint32_t queue_num=0;
+ vkGetPhysicalDeviceQueueFamilyProperties(gpu_list[i],&queue_num,NULL);
+ VkQueueFamilyProperties queue_properties_list[queue_num];
+ vkGetPhysicalDeviceQueueFamilyProperties(gpu_list[i], &queue_num, queue_properties_list);
+ if(gog_verify_device_queues(queue_properties_list,queue_num,queue_flags).status==GOG_FAIL)
+ {
+ continue;
+ }
+ for(int j=0;j<queue_num;j++);
+
+ if(vkGetPhysicalDeviceSurfaceSupportKHR(gpu_list[i], , , ))
+ {
+ continue;
+ }
+ else
+ {
+ gh->vk_gpu=gpu_list[i];
+ printf("valid gpu: %s\n",gpu_prop.deviceName);
+ }
+ }
+ return GET_GOG_RESULT(GOG_SUCCES, 0);
+}
+
+gog_result gog_verify_device_extensions(struct gog_vk_ext gog_ext,VkExtensionProperties *ext, int ext_count)
+{
+ for(int i=0;i<gog_ext.vk_ext_count;i++)
+ {
+ int found=0;
+ for(int j=0;j<ext_count;j++)
+ {
+ if(strcmp(gog_ext.vk_ext_pp[i],ext[j].extensionName))
+ {
+ found=1;
+ break;
+ }
+ }
+ if(found==0)return GET_GOG_RESULT(GOG_FAIL, GOG_ERR_MISMATCH);
+ }
+ return GET_GOG_RESULT(GOG_SUCCES, 0);
+}
+
+gog_result gog_find_device_queues(gog_graphics_hndl *gh, VkQueueFamilyProperties * queue_prop_p, int queue_prop_count)
+{
+
+ gh->vk_queue_index_graphics=-1;
+ gh->vk_queue_index_compute=-1;
+ gh->vk_queue_index_transfer=-1;
+ gh->vk_queue_index_sparse_binding=-1;
+ for(int i=0;i<queue_prop_count;i++)
+ {
+ if(queue_prop_p[i].queueFlags==VK_QUEUE_GRAPHICS_BIT)
+ {
+ gh->vk_queue_index_graphics=i;
+ }
+ if(queue_prop_p[i].queueFlags==VK_QUEUE_COMPUTE_BIT)
+ {
+ gh->vk_queue_index_compute=i;
+ }
+ if(queue_prop_p[i].queueFlags==VK_QUEUE_TRANSFER_BIT)
+ {
+ gh->vk_queue_index_transfer=i;
+ }
+ if(queue_prop_p[i].queueFlags==VK_QUEUE_SPARSE_BINDING_BIT)
+ {
+ gh->vk_queue_index_sparse_binding=i;
+ }
+ }
+ return GET_GOG_RESULT(GOG_SUCCES, 0);
+}
+
libgogvk/gogvid.h
@@ -0,0 +1,63 @@
+#include "gogerr.h"
+#include <vulkan/vulkan_core.h>
+#include <SDL2/SDL.h>
+#include <SDL2/SDL_events.h>
+#include <SDL2/SDL_video.h>
+#include <SDL2/SDL_vulkan.h>
+
+#ifndef GOG_ENGINE_NAME
+#define GOG_ENGINE_NAME "gog"
+#endif
+
+#ifndef GOG_APPLICATION_NAME
+#define GOG_APPLICATION_NAME "gog"
+#endif
+
+#ifndef GOG_WINDOW_TITLE
+#define GOG_WINDOW_TITLE "gog"
+#endif
+
+#ifndef GOG_WINDOW_REZ_WIDTH
+#define GOG_WINDOW_REZ_WIDTH 1920
+#endif
+
+#ifndef GOG_WINDOW_REZ_HEIGHT
+#define GOG_WINDOW_REZ_HEIGHT 1080
+#endif
+
+#define GOG_USE_QUEUE_GRAPHICS 0x1
+#define GOG_USE_QUEUE_PRESENT 0x2
+
+typedef struct vk_graphics_vars
+{
+ VkInstance vk_instance;
+ VkSurfaceKHR vk_surface;
+ VkDevice vk_device;
+ VkPhysicalDevice vk_gpu;
+ int32_t vk_queue_index_graphics;
+ int32_t vk_queue_index_compute;
+ int32_t vk_queue_index_transfer;
+ int32_t vk_queue_index_sparse_binding;
+ int32_t vk_queues_c;
+ VkQueue * vk_queues_p;
+ VkSwapchainKHR vk_swapchain;
+ VkSharingMode * vk_shaders_p;
+ VkPipeline * vk_pipelines_p;
+ VkPipelineLayout * vk_pipeline_layouts_p;
+
+ SDL_Window * sdl_window_p;
+}gog_graphics_hndl;
+
+struct gog_vk_ext
+{
+ int vk_ext_count;
+ const char ** vk_ext_pp;
+};
+
+
+gog_result gog_open_sdl_window(SDL_Window * window, struct gog_vk_ext * extensions);
+gog_result gog_vulkan_init(VkInstance * instance, struct gog_vk_ext extensions, int flags);
+gog_result gog_get_physical_device(gog_graphics_hndl *gh, struct gog_vk_ext ext, int flags);
+gog_result gog_verify_device_extensions(struct gog_vk_ext gog_ext,VkExtensionProperties *ext, int ext_count);
+gog_result gog_find_device_queues(gog_graphics_hndl *gh, VkQueueFamilyProperties * queue_prop_p, int queue_prop_count);
+gog_result gog_graphics_init(gog_graphics_hndl *gh);
libgogvk/gogvid.o
Binary file
game
Binary file
libgogvk.a
Binary file
main.c
@@ -0,0 +1,26 @@
+#include <SDL2/SDL_events.h>
+#include <SDL2/SDL_video.h>
+#include <SDL2/SDL_vulkan.h>
+#include <stdio.h>
+#include <vulkan/vulkan_core.h>
+#include <SDL2/SDL.h>
+#include "libgogvk/gogvid.h"
+
+int main()
+{
+ SDL_Event e;
+ gog_graphics_hndl gh;
+ gog_graphics_init(&gh);
+
+ while(1)
+ {
+ SDL_PollEvent(&e);
+ if(e.type==SDL_QUIT)
+ {
+ break;
+ }
+ }
+ vkDestroyInstance(gh.vk_instance, NULL);
+ SDL_DestroyWindow(gh.sdl_window_p);
+ SDL_Quit();
+}
main.o
Binary file
makefile
@@ -0,0 +1,29 @@
+CC=gcc
+CFLAGS=-Wall -Wextra -O2 -I./libgogvk `sdl2-config --cflags`
+LIBS=-lvulkan `sdl2-config --libs`
+
+LIB_SRC=./libgogvk/gogvid.c
+LIB_OBJ=$(LIB_SRC:.c=.o)
+
+MAIN_SRC=main.c
+MAIN_OBJ=$(MAIN_SRC:.c=.o)
+
+LIB_NAME=libgogvk.a
+TARGET=game
+
+all: $(TARGET)
+
+$(LIB_NAME):$(LIB_OBJ)
+ ar rcs $@ $^
+
+$(TARGET): $(MAIN_OBJ) $(LIB_NAME)
+ $(CC) $(MAIN_OBJ) -L. -lgogvk $(LIBS) -o $@
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+clean:
+ rm -f $(LIB_OBJ) $(MAIN_OBJ) $(LIB_NAME) $(TARGET)
+.PHONY: all clean
+
+