starfield

starfield.git
git clone git://git.lenczewski.org/starfield.git
Log | Files | Refs | Submodules | README | LICENSE

linux_starfield.h (2410B)


      1 #ifndef LINUX_STARFIELD_H
      2 #define LINUX_STARFIELD_H
      3 
      4 #define _XOPEN_SOURCE 700
      5 #define _GNU_SOURCE
      6 #define _DEFAULT_SOURCE
      7 
      8 #include <stdio.h>
      9 #include <string.h>
     10 #include <unistd.h>
     11 
     12 #include <sys/mman.h>
     13 
     14 #include <dlfcn.h>
     15 
     16 #include <alsa/asoundlib.h>
     17 
     18 #include <wayland-client.h>
     19 #include "xdg-shell.h"
     20 
     21 #define VK_USE_PLATFORM_WAYLAND_KHR
     22 #include <vulkan/vulkan.h>
     23 #include <vulkan/vulkan_wayland.h>
     24 
     25 #include "starfield_api.h"
     26 #include "renderer.h"
     27 #include "utils.h"
     28 
     29 struct starfield_thread {
     30 	u32 id;
     31 };
     32 
     33 /* alsa state */
     34 struct linux_audio {
     35 	snd_pcm_t *handle;
     36 
     37 	struct starfield_audio_buffer buffer;
     38 
     39 	b32 enabled;
     40 };
     41 
     42 /* wayland state */
     43 struct linux_video {
     44 	struct wl_display *display;
     45 	struct wl_registry *registry;
     46 
     47 	struct wl_compositor *compositor;
     48 	struct xdg_wm_base *wm_base;
     49 
     50 	struct wl_surface *surface;
     51 	struct xdg_surface *xdg_surface;
     52 	struct xdg_toplevel *xdg_toplevel;
     53 
     54 	u32 width, height;
     55 };
     56 
     57 /* vulkan state */
     58 struct linux_vulkan {
     59 	VkInstance instance;
     60 	VkDebugUtilsMessengerEXT debug_messenger;
     61 	VkSurfaceKHR surface;
     62 
     63 	struct renderer *renderer;
     64 };
     65 
     66 struct linux_state {
     67 	struct arena platform_arena;
     68 	struct arena renderer_arena;
     69 	struct arena starfield_arena;
     70 
     71 	struct linux_audio audio;
     72 	struct linux_video video;
     73 	struct linux_vulkan vulkan;
     74 
     75 	struct platform_api platform_api;
     76 	struct render_api render_api;
     77 	struct starfield_api starfield_api;
     78 
     79 	b32 running;
     80 };
     81 
     82 internal u64
     83 linux_elapsed_ns(struct timespec *restrict start, struct timespec *restrict end);
     84 
     85 internal b32
     86 load_starfield_api(char const *filename, struct starfield_api *api);
     87 
     88 internal struct platform_api
     89 load_platform_api(void);
     90 
     91 internal b32
     92 init_memory(struct arena *platform_arena, u64 platform_capacity,
     93 	    struct arena *renderer_arena, u64 renderer_capacity,
     94 	    struct arena *starfield_arena, u64 starfield_capacity);
     95 
     96 internal b32
     97 init_audio(struct arena *arena, struct linux_audio *audio, u32 period_us, u32 buffered_periods);
     98 
     99 internal void
    100 play_audio(struct linux_audio *audio);
    101 
    102 internal b32
    103 init_video(struct arena *arena, struct linux_video *video, char const *display_name);
    104 
    105 internal void
    106 draw_frame(struct linux_video *video);
    107 
    108 internal b32
    109 init_vulkan(struct arena *arena, struct linux_vulkan *vulkan,
    110 	    struct wl_display *display, struct wl_surface *surface,
    111 	    u32 width, u32 height);
    112 
    113 internal void
    114 free_vulkan(struct linux_vulkan *vulkan);
    115 
    116 #endif /* LINUX_STARFIELD_H */