Initial commit with the chapter-0 code working.

This commit is contained in:
Zed A. Shaw 2025-11-24 10:50:50 -05:00
commit 7298568818
19 changed files with 8380 additions and 0 deletions

31
.gitignore vendored Normal file
View file

@ -0,0 +1,31 @@
# ---> Vim
# Swap
[._]*.s[a-v][a-z]
!*.svg # comment out if you don't need vector files
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]
# Session
Session.vim
Sessionx.vim
# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~
subprojects
builddir
ttassets
backup
*.exe
*.dll
*.world
coverage
coverage/*
.venv

1
.vimrc_proj Normal file
View file

@ -0,0 +1 @@
set makeprg=make\ -f\ ../Makefile\ build

53
Makefile Normal file
View file

@ -0,0 +1,53 @@
ROOT_DIR := $(dir $(realpath $(lastword $(MAKEFILE_LIST))))
all: build test
reset:
ifeq '$(OS)' 'Windows_NT'
powershell -executionpolicy bypass .\scripts\reset_build.ps1
else
sh -x ./scripts/reset_build.sh
endif
%.cpp : %.rl
ragel -I $(ROOT_DIR) -G1 -o $@ $<
%.dot: %.rl
ragel -Vp -I $(ROOT_DIR) -o $@ $<
%.png: %.dot
dot -Tpng $< -o $@
build:
meson compile -j 10 -C $(ROOT_DIR)/builddir
release_build:
meson --wipe builddir -Db_ndebug=true --buildtype release
meson compile -j 10 -C builddir
debug_build:
meson setup --wipe builddir -Db_ndebug=true --buildtype debugoptimized
meson compile -j 10 -C builddir
run: build
ifeq '$(OS)' 'Windows_NT'
powershell "cp ./builddir/hellovulk.exe ."
./hellovulk
else
./builddir/hellovulk
endif
debug: build
gdb --nx -x .gdbinit --ex run --args builddir/hellovulk
debug_run: build
gdb --nx -x .gdbinit --batch --ex run --ex bt --ex q --args builddir/hellovulk
clean:
meson compile --clean -C builddir
debug_test: build
gdb --nx -x .gdbinit --ex run --ex bt --ex q --args builddir/runtests -e "[pathing]"
money:
scc --exclude-dir subprojects

14
main.cpp Normal file
View file

@ -0,0 +1,14 @@
#include <vk_engine.h>
int main(int argc, char* argv[])
{
VulkanEngine engine;
engine.init();
engine.run();
engine.cleanup();
return 0;
}

86
meson.build Normal file
View file

@ -0,0 +1,86 @@
# clang might need _LIBCPP_ENABLE_CXX26_REMOVED_CODECVT
project('hellovulk', 'cpp',
version: '0.1.0',
default_options: [
'cpp_std=c++23',
'cpp_args=-D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1',
])
# use this for common options only for our executables
cpp_args=[]
link_args=[]
# these are passed as override_defaults
exe_defaults = [ 'warning_level=2' ]
cc = meson.get_compiler('cpp')
dependencies = []
if build_machine.system() == 'windows'
add_global_link_arguments(
'-static-libgcc',
'-static-libstdc++',
'-static',
language: 'cpp',
)
sdl2_main = subproject('sld2').get_variable('sdl2_main')
opengl32 = cc.find_library('opengl32', required: true)
winmm = cc.find_library('winmm', required: true)
gdi32 = cc.find_library('gdi32', required: true)
dependencies += [
opengl32, winmm, gdi32, sdl2_main
]
exe_defaults += ['werror=true']
elif build_machine.system() == 'darwin'
add_global_link_arguments(
language: 'cpp',
)
opengl = dependency('OpenGL')
corefoundation = dependency('CoreFoundation')
carbon = dependency('Carbon')
cocoa = dependency('Cocoa')
iokit = dependency('IOKit')
corevideo = dependency('CoreVideo')
link_args += ['-ObjC']
exe_defaults += ['werror=false']
dependencies += [
opengl, corefoundation, carbon, cocoa, iokit, corevideo
]
endif
vma = subproject('vulkan-memory-allocator').get_variable('vma_allocator_dep')
vulkanheaders = subproject('vulkan-headers').get_variable('vulkan_headers_dep')
vkbootstrap = subproject('vk-bootstrap').get_variable('vk_bootstrap_dep')
glm = subproject('glm').get_variable('glm_dep')
imgui = subproject('imgui').get_variable('imgui_dep')
sdl2 = subproject('sdl2').get_variable('sdl2_dep')
dependencies += [
vma,
vulkanheaders,
vkbootstrap,
glm,
imgui,
sdl2,
]
sources = [
'vk_initializers.cpp',
'vk_engine.cpp',
'main.cpp',
]
tests = [
]
executable('hellovulk', sources,
cpp_args: cpp_args,
link_args: link_args,
override_options: exe_defaults,
dependencies: dependencies)

10
scripts/reset_build.sh Normal file
View file

@ -0,0 +1,10 @@
#!/usr/bin/env bash
mv -f ./subprojects/packagecache .
rm -rf subprojects builddir
mkdir subprojects
mv -f packagecache ./subprojects/ && true
mkdir builddir
cp wraps/*.wrap subprojects/
# on OSX you can't do this with static
meson setup --default-library=static --prefer-static builddir

7988
stb_image.h Normal file

File diff suppressed because it is too large Load diff

60
vk_engine.cpp Normal file
View file

@ -0,0 +1,60 @@

#include "vk_engine.h"
#include <print>
#include <SDL.h>
#include <SDL_vulkan.h>
#include <vk_types.h>
#include <vk_initializers.h>
void VulkanEngine::init()
{
// We initialize SDL and create a window with it.
SDL_Init(SDL_INIT_VIDEO);
SDL_WindowFlags window_flags = (SDL_WindowFlags)(SDL_WINDOW_VULKAN);
_window = SDL_CreateWindow(
"Vulkan Engine",
SDL_WINDOWPOS_UNDEFINED,
SDL_WINDOWPOS_UNDEFINED,
int(_windowExtent.width),
int(_windowExtent.height),
window_flags
);
//everything went fine
_isInitialized = true;
}
void VulkanEngine::cleanup()
{
if (_isInitialized) {
SDL_DestroyWindow(_window);
}
}
void VulkanEngine::draw()
{
//nothing yet
}
void VulkanEngine::run()
{
SDL_Event e;
bool bQuit = false;
//main loop
while (!bQuit)
{
//Handle events on queue
while (SDL_PollEvent(&e) != 0)
{
//close the window when user alt-f4s or clicks the X button
if (e.type == SDL_QUIT) bQuit = true;
}
draw();
}
}

29
vk_engine.h Normal file
View file

@ -0,0 +1,29 @@
// vulkan_guide.h : Include file for standard system include files,
// or project specific include files.
#pragma once
#include <vk_types.h>
class VulkanEngine {
public:
bool _isInitialized{ false };
int _frameNumber {0};
VkExtent2D _windowExtent{ 1700 , 900 };
struct SDL_Window* _window{ nullptr };
//initializes everything in the engine
void init();
//shuts down the engine
void cleanup();
//draw loop
void draw();
//run main loop
void run();
};

1
vk_initializers.cpp Normal file
View file

@ -0,0 +1 @@
#include <vk_initializers.h>

12
vk_initializers.h Normal file
View file

@ -0,0 +1,12 @@
// vulkan_guide.h : Include file for standard system include files,
// or project specific include files.
#pragma once
#include <vk_types.h>
namespace vkinit {
//vulkan init code goes here
}

8
vk_types.h Normal file
View file

@ -0,0 +1,8 @@
// vulkan_guide.h : Include file for standard system include files,
// or project specific include files.
#pragma once
#include <vulkan/vulkan.h>
//we will add our main reusable types here

11
wraps/catch2.wrap Normal file
View file

@ -0,0 +1,11 @@
[wrap-file]
directory = Catch2-3.11.0
source_url = https://github.com/catchorg/Catch2/archive/v3.11.0.tar.gz
source_filename = Catch2-3.11.0.tar.gz
source_hash = 82fa1cb59dc28bab220935923f7469b997b259eb192fb9355db62da03c2a3137
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/catch2_3.11.0-1/Catch2-3.11.0.tar.gz
wrapdb_version = 3.11.0-1
[provide]
catch2 = catch2_dep
catch2-with-main = catch2_with_main_dep

13
wraps/glm.wrap Normal file
View file

@ -0,0 +1,13 @@
[wrap-file]
directory = glm-1.0.1
source_url = https://github.com/g-truc/glm/archive/refs/tags/1.0.1.tar.gz
source_filename = glm-1.0.1.tar.gz
source_hash = 9f3174561fd26904b23f0db5e560971cbf9b3cbda0b280f04d5c379d03bf234c
patch_filename = glm_1.0.1-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/glm_1.0.1-1/get_patch
patch_hash = 25679275e26bc4c36bb617d1b4a52197039402af828d2a4bf67b3c0260a5df6a
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/glm_1.0.1-1/glm-1.0.1.tar.gz
wrapdb_version = 1.0.1-1
[provide]
glm = glm_dep

13
wraps/imgui.wrap Normal file
View file

@ -0,0 +1,13 @@
[wrap-file]
directory = imgui-1.91.6
source_url = https://github.com/ocornut/imgui/archive/refs/tags/v1.91.6.tar.gz
source_filename = imgui-1.91.6.tar.gz
source_hash = c5fbc5dcab1d46064001c3b84d7a88812985cde7e0e9ced03f5677bec1ba502a
patch_filename = imgui_1.91.6-3_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/imgui_1.91.6-3/get_patch
patch_hash = 2f7977114ba07d06559aaf8890a92a4ebd25186592d4447954605aaf2244634d
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/imgui_1.91.6-3/imgui-1.91.6.tar.gz
wrapdb_version = 1.91.6-3
[provide]
imgui = imgui_dep

15
wraps/sdl2.wrap Normal file
View file

@ -0,0 +1,15 @@
[wrap-file]
directory = SDL2-2.32.8
source_url = https://github.com/libsdl-org/SDL/releases/download/release-2.32.8/SDL2-2.32.8.tar.gz
source_filename = SDL2-2.32.8.tar.gz
source_hash = 0ca83e9c9b31e18288c7ec811108e58bac1f1bb5ec6577ad386830eac51c787e
patch_filename = sdl2_2.32.8-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/sdl2_2.32.8-1/get_patch
patch_hash = 5df17ea39ca418826db20e96bd821fa52b5718dac64b6225119fb6588c2744f0
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sdl2_2.32.8-1/SDL2-2.32.8.tar.gz
wrapdb_version = 2.32.8-1
[provide]
sdl2 = sdl2_dep
sdl2main = sdl2main_dep
sdl2_test = sdl2_test_dep

9
wraps/vk-bootstrap.wrap Normal file
View file

@ -0,0 +1,9 @@
[wrap-git]
directory=vk-bootstrap-1.4.332
url=https://github.com/charles-lunarg/vk-bootstrap.git
revision=HEAD
depth=1
method=cmake
[provide]
vkbootstrap = vkbootstrap_dep

13
wraps/vulkan-headers.wrap Normal file
View file

@ -0,0 +1,13 @@
[wrap-file]
directory = Vulkan-Headers-1.3.283
source_url = https://github.com/KhronosGroup/Vulkan-Headers/archive/v1.3.283.tar.gz
source_filename = vulkan-headers-1.3.283.tar.gz
source_hash = a76ff77815012c76abc9811215c2167128a73a697bcc23948e858d1f7dd54a85
patch_filename = vulkan-headers_1.3.283-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/vulkan-headers_1.3.283-1/get_patch
patch_hash = 00e30d35117ae90a19b5b8878746fceaf31b41778b817ca9e6b3ae6063be8233
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/vulkan-headers_1.3.283-1/vulkan-headers-1.3.283.tar.gz
wrapdb_version = 1.3.283-1
[provide]
vulkanheaders = vulkan_headers_dep

View file

@ -0,0 +1,13 @@
[wrap-file]
directory = VulkanMemoryAllocator-3.1.0
source_url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/archive/refs/tags/v3.1.0.tar.gz
source_filename = VulkanMemoryAllocator-3.1.0.tar.gz
source_hash = ae134ecc37c55634f108e926f85d5d887b670360e77cd107affaf3a9539595f2
patch_filename = vulkan-memory-allocator_3.1.0-1_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/vulkan-memory-allocator_3.1.0-1/get_patch
patch_hash = d62a983856146f4529c5c5a46b13c0451a4f7e02d0966606dcd054a204c5fd80
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/vulkan-memory-allocator_3.1.0-1/VulkanMemoryAllocator-3.1.0.tar.gz
wrapdb_version = 3.1.0-1
[provide]
vulkan-memory-allocator = vma_allocator_dep