Commit acc9ebc

gogu <ghglazar@gmail.com>
2026-03-09 22:11:51
initial commit
1 parent f471b46
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
+
+