added render loop for a triangle shader (broken)

This commit is contained in:
Matthew 2025-02-27 22:38:32 +11:00
parent d16dbe63fa
commit e04111aefb
10 changed files with 711 additions and 49 deletions

View File

@ -12,7 +12,7 @@ if [ -v vulkan ]; then render_flag="-DSTG_VULKAN_RENDERER"; echo "[v
if [ -v opengl ] && [ ! -v render_flag ]; then render_flag="-DSTG_OPENGL_RENDERER"; echo "[opengl renderer]"; fi if [ -v opengl ] && [ ! -v render_flag ]; then render_flag="-DSTG_OPENGL_RENDERER"; echo "[opengl renderer]"; fi
if [ -v webgl ] && [ ! -v render_flag ]; then render_flag="-DSTG_WEBGL_RENDERER"; echo "[webgl renderer]"; fi if [ -v webgl ] && [ ! -v render_flag ]; then render_flag="-DSTG_WEBGL_RENDERER"; echo "[webgl renderer]"; fi
if [ -v dx11 ] && [ ! -v render_flag ]; then render_flag="-DSTG_DX11_RENDERER"; echo "[dx11 renderer]"; fi if [ -v dx11 ] && [ ! -v render_flag ]; then render_flag="-DSTG_DX11_RENDERER"; echo "[dx11 renderer]"; fi
if [ ! -v render_flag ]; then render_flag="-DSTG_VULKAN_RENDERER"; echo "[default renderer - vulkan]"; fi if [ ! -v render_flag ]; then render_flag="-DSTG_VULKAN_RENDERER"; vulkan="vulkan"; echo "[default renderer - vulkan]"; fi
# for command line build args # for command line build args
auto_compile_flags="${render_flag}" auto_compile_flags="${render_flag}"
@ -42,7 +42,7 @@ glsl_stage_tesc="-fshader-stage=tesc"
glsl_stage_tese="-fshader-stage=tese" glsl_stage_tese="-fshader-stage=tese"
glsl_stage_geom="-fshader-stage=geom" glsl_stage_geom="-fshader-stage=geom"
glsl_stage_comp="-fshader-stage=comp" glsl_stage_comp="-fshader-stage=comp"
glsl_out="-o/build/shaders/glsl/" glsl_out="-o./shaders/glsl/"
clang_common="${include_flags} -g -Xclang -flto-visibility-public-std -Wno-unknown-warning-option -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Wno-for-loop-analysis -DVMA_STATIC_VULKAN_FUNCTIONS=0" clang_common="${include_flags} -g -Xclang -flto-visibility-public-std -Wno-unknown-warning-option -fdiagnostics-absolute-paths -Wall -Wno-missing-braces -Wno-unused-function -Wno-writable-strings -Wno-unused-value -Wno-unused-variable -Wno-unused-local-typedef -Wno-deprecated-register -Wno-deprecated-declarations -Wno-unused-but-set-variable -Wno-single-bit-bitfield-constant-conversion -Wno-compare-distinct-pointer-types -Wno-initializer-overrides -Wno-incompatible-pointer-types-discards-qualifiers -Wno-for-loop-analysis -DVMA_STATIC_VULKAN_FUNCTIONS=0"
@ -82,35 +82,36 @@ if [ ! -f $vma_obj ]; then
fi fi
mkdir -p ./shaders/glsl if [ -v vulkan ]; then
for file in ../src/shaders/glsl/*.glsl; do mkdir -p ./shaders/glsl
base_name=$(basename -- "$file" .glsl) mkdir -p ../src/file_data
echo $base_name
echo $file
case base_name in for file in ../src/shaders/glsl/*.glsl; do
*.vert) base_name=$(basename -- "$file" .glsl)
glsl_stage="${glsl_stage_vert}"
;; case "$base_name" in
*.frag) *.vert) glsl_stage="${glsl_stage_vert}" ;;
glsl_stage="${glsl_stage_vert}" *.frag) glsl_stage="${glsl_stage_frag}" ;;
;; *.tesc) glsl_stage="${glsl_stage_tesc}" ;;
*.tesc) *.tese) glsl_stage="${glsl_stage_tese}" ;;
glsl_stage="${glsl_stage_tesc}" *.geom) glsl_stage="${glsl_stage_geom}" ;;
;; *.comp) glsl_stage="${glsl_stage_comp}" ;;
*.tese) *) continue ;;
glsl_stage="${glsl_stage_tese}"
;;
*.geom)
glsl_stage="${glsl_stage_geom}"
;;
*.comp)
glsl_stage="${glsl_stage_comp}"
;;
esac esac
$glsl_compile $glsl_flags $glsl_stage file "${glsl_out}${base_name}.spv" $glsl_compile $glsl_flags $glsl_stage $file "${glsl_out}${base_name}.spv"
done done
rm -f ../src/file_data/spv.c
touch ../src/file_data/spv.c
for file in ./shaders/glsl/*.spv; do
base_name=$(basename -- "$file" .spv)
xxd -n "shader_${base_name}" -i $file >> ../src/file_data/spv.c
done
fi
$cpp_compiler $vma_compile_flags $vma_source_files $vma_out $vma_obj $cpp_compiler $vma_compile_flags $vma_source_files $vma_out $vma_obj

180
src/file_data/spv.c Normal file
View File

@ -0,0 +1,180 @@
unsigned char shader_quad_frag[] = {
0x03, 0x02, 0x23, 0x07, 0x00, 0x06, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00,
0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x07, 0x00, 0x04, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00,
0x04, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00,
0x02, 0x00, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00,
0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x63, 0x70,
0x70, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65,
0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00,
0x04, 0x00, 0x08, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c,
0x45, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x69,
0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x05, 0x00, 0x04, 0x00,
0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x05, 0x00, 0x09, 0x00, 0x00, 0x00, 0x6f, 0x75, 0x74, 0x43,
0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x66, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f,
0x72, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x09, 0x00, 0x00, 0x00,
0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00,
0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00,
0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x20, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x07, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x20, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
0x06, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x3f,
0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
0x05, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x00, 0x00,
0x0d, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
0x06, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00,
0x0d, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x07, 0x00,
0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x10, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x3e, 0x00, 0x03, 0x00, 0x09, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
};
unsigned int shader_quad_frag_len = 572;
unsigned char shader_quad_vert[] = {
0x03, 0x02, 0x23, 0x07, 0x00, 0x06, 0x01, 0x00, 0x0b, 0x00, 0x0d, 0x00,
0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00,
0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00,
0x47, 0x4c, 0x53, 0x4c, 0x2e, 0x73, 0x74, 0x64, 0x2e, 0x34, 0x35, 0x30,
0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00,
0x26, 0x00, 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00,
0x02, 0x00, 0x00, 0x00, 0xcc, 0x01, 0x00, 0x00, 0x04, 0x00, 0x0a, 0x00,
0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c, 0x45, 0x5f, 0x63, 0x70,
0x70, 0x5f, 0x73, 0x74, 0x79, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65,
0x5f, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x00,
0x04, 0x00, 0x08, 0x00, 0x47, 0x4c, 0x5f, 0x47, 0x4f, 0x4f, 0x47, 0x4c,
0x45, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x5f, 0x64, 0x69,
0x72, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x00, 0x05, 0x00, 0x04, 0x00,
0x04, 0x00, 0x00, 0x00, 0x6d, 0x61, 0x69, 0x6e, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x70, 0x6f, 0x73, 0x69,
0x74, 0x69, 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00,
0x17, 0x00, 0x00, 0x00, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x73, 0x00, 0x00,
0x05, 0x00, 0x06, 0x00, 0x20, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x50,
0x65, 0x72, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x00, 0x00, 0x00, 0x00,
0x06, 0x00, 0x06, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x00,
0x06, 0x00, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65,
0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x07, 0x00, 0x20, 0x00, 0x00, 0x00,
0x02, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x43, 0x6c, 0x69, 0x70, 0x44,
0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x00, 0x06, 0x00, 0x07, 0x00,
0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x43,
0x75, 0x6c, 0x6c, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x00,
0x05, 0x00, 0x03, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x05, 0x00, 0x06, 0x00, 0x26, 0x00, 0x00, 0x00, 0x67, 0x6c, 0x5f, 0x56,
0x65, 0x72, 0x74, 0x65, 0x78, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x00, 0x00,
0x05, 0x00, 0x05, 0x00, 0x31, 0x00, 0x00, 0x00, 0x66, 0x72, 0x61, 0x67,
0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00,
0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x48, 0x00, 0x05, 0x00, 0x20, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x48, 0x00, 0x05, 0x00,
0x20, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00, 0x26, 0x00, 0x00, 0x00,
0x0b, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x47, 0x00, 0x04, 0x00,
0x31, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x13, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00,
0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x16, 0x00, 0x03, 0x00,
0x06, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,
0x15, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x08, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x04, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
0x20, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x0b, 0x00, 0x00, 0x00,
0x0c, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
0x06, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xbf, 0x2c, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
0x0f, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00,
0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x3f, 0x2c, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00,
0x2c, 0x00, 0x05, 0x00, 0x07, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00,
0x0e, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x06, 0x00,
0x0a, 0x00, 0x00, 0x00, 0x13, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
0x11, 0x00, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,
0x14, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x1c, 0x00, 0x04, 0x00, 0x15, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x09, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x15, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
0x16, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x2b, 0x00, 0x04, 0x00, 0x06, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x3f, 0x2c, 0x00, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00,
0x19, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x0d, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00,
0x1a, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x0d, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x06, 0x00, 0x14, 0x00, 0x00, 0x00,
0x1b, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x06, 0x00, 0x15, 0x00, 0x00, 0x00,
0x1c, 0x00, 0x00, 0x00, 0x19, 0x00, 0x00, 0x00, 0x1a, 0x00, 0x00, 0x00,
0x1b, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00, 0x1d, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00,
0x08, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x1c, 0x00, 0x04, 0x00, 0x1f, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
0x1e, 0x00, 0x00, 0x00, 0x1e, 0x00, 0x06, 0x00, 0x20, 0x00, 0x00, 0x00,
0x1d, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00,
0x1f, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x21, 0x00, 0x00, 0x00,
0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00,
0x21, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x15, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00,
0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
0x25, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x23, 0x00, 0x00, 0x00,
0x3b, 0x00, 0x04, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00,
0x01, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x28, 0x00, 0x00, 0x00,
0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
0x2e, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x1d, 0x00, 0x00, 0x00,
0x20, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
0x14, 0x00, 0x00, 0x00, 0x3b, 0x00, 0x04, 0x00, 0x30, 0x00, 0x00, 0x00,
0x31, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
0x33, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,
0x36, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xf8, 0x00, 0x02, 0x00,
0x05, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x00,
0x13, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x17, 0x00, 0x00, 0x00,
0x1c, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00,
0x27, 0x00, 0x00, 0x00, 0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00,
0x28, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
0x27, 0x00, 0x00, 0x00, 0x3d, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00,
0x2a, 0x00, 0x00, 0x00, 0x29, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00,
0x06, 0x00, 0x00, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x05, 0x00, 0x06, 0x00, 0x00, 0x00,
0x2c, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,
0x50, 0x00, 0x07, 0x00, 0x1d, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00,
0x2b, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x0d, 0x00, 0x00, 0x00,
0x18, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x2e, 0x00, 0x00, 0x00,
0x2f, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x24, 0x00, 0x00, 0x00,
0x3e, 0x00, 0x03, 0x00, 0x2f, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x00, 0x00,
0x3d, 0x00, 0x04, 0x00, 0x23, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
0x26, 0x00, 0x00, 0x00, 0x41, 0x00, 0x05, 0x00, 0x33, 0x00, 0x00, 0x00,
0x34, 0x00, 0x00, 0x00, 0x17, 0x00, 0x00, 0x00, 0x32, 0x00, 0x00, 0x00,
0x3d, 0x00, 0x04, 0x00, 0x14, 0x00, 0x00, 0x00, 0x35, 0x00, 0x00, 0x00,
0x34, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x03, 0x00, 0x31, 0x00, 0x00, 0x00,
0x35, 0x00, 0x00, 0x00, 0xfd, 0x00, 0x01, 0x00, 0x38, 0x00, 0x01, 0x00
};
unsigned int shader_quad_vert_len = 1512;

View File

@ -35,6 +35,10 @@ int main(int argc, char **argv)
break; break;
} }
} }
BeginFrame();
DrawTriangle();
FinishFrame();
} }
DestroyRenderer(); DestroyRenderer();

View File

@ -297,7 +297,7 @@ b32 ChangeWorkingDir(const char *)
u8 *OpenFile(const char *) u8 *OpenFile(const char *)
{ {
u8 *bytes; u8 *bytes = NULL;
return bytes; return bytes;
} }

View File

@ -22,3 +22,17 @@ void DestroyRenderer() {
_DestroyRenderer(); _DestroyRenderer();
} }
b32 BeginFrame()
{
return _BeginFrame();
}
void DrawTriangle()
{
_DrawTriangle();
}
b32 FinishFrame()
{
return _FinishFrame();
}

View File

@ -19,3 +19,8 @@
b32 InitRenderer(Arena *arena); b32 InitRenderer(Arena *arena);
void DestroyRenderer(); void DestroyRenderer();
// Drawing
static b32 DrawFrame();
static void DrawTriangle();
static b32 FinishFrame();

View File

@ -15,6 +15,237 @@ void _DestroyRenderer()
DestroyVulkan(); DestroyVulkan();
} }
b32 _BeginFrame()
{
b32 success = true;
VkResult result;
u8 f_ix = renderer.frame_state.frame_cnt % FRAME_OVERLAP;
VkDevice device = renderer.vk.device;
VkCommandBuffer cmd = renderer.vk.frame.buffers[f_ix];
VkFence fence = renderer.vk.frame.render_fences[f_ix];
VkSemaphore sc_sem = renderer.vk.frame.swapchain_sems[f_ix];
VkSemaphore rndr_sem = renderer.vk.frame.render_sems[f_ix];
VkSwapchainKHR swapchain = renderer.vk.swapchain;
// TODO(MA): make this work with VK_PRESENT_MODE_MAILBOX_KHR and remove assignment of present mode to FIFO
result = vkWaitForFences(device, 1, &fence, VK_TRUE, 1000000000);
if (result != VK_SUCCESS)
{
Printf("vkWaitForFences failure: %s", VkResultStr(result));
success = false;
}
if (success)
{
result = vkAcquireNextImageKHR(device, swapchain, 1000000000, sc_sem, 0, &renderer.frame_state.img_ix);
if (result != VK_SUCCESS)
{
Printf("vkAcquireNextImageKHR failure: %s", VkResultStr(result));
success = false;
}
}
if (success)
{
result = vkResetFences(device, 1, &fence);
if (result != VK_SUCCESS)
{
Printf("vkResetFences failure: %s", VkResultStr(result));
success = false;
}
}
if (success)
{
result = vkResetCommandBuffer(cmd, 0);
if (result != VK_SUCCESS)
{
Printf("vkResetCommandBuffer failure: %s", VkResultStr(result));
success = false;
}
}
if (success)
{
VkCommandBufferBeginInfo cmd_info = {
.sType = STYPE(COMMAND_BUFFER_BEGIN_INFO),
.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT,
};
result = vkBeginCommandBuffer(cmd, &cmd_info);
if (result != VK_SUCCESS)
{
Printf("vkBeginCommandBuffer failure: %s", VkResultStr(result));
success = false;
}
}
return success;
}
void _DrawTriangle()
{
u8 f_ix = renderer.frame_state.frame_cnt % FRAME_OVERLAP;
VkCommandBuffer cmd = renderer.vk.frame.buffers[f_ix];
TransitionImage(cmd, renderer.vk.sc.draw_img.img, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
TransitionImage(cmd, renderer.vk.sc.depth_img.img, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL);
VkRenderingAttachmentInfo col_attach_info = {
.sType = STYPE(RENDERING_ATTACHMENT_INFO),
.imageView = renderer.vk.sc.draw_img.view,
.imageLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
};
VkRenderingAttachmentInfo depth_attach_info = {
.sType = STYPE(RENDERING_ATTACHMENT_INFO),
.imageView = renderer.vk.sc.depth_img.view,
.imageLayout = VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL,
.loadOp = VK_ATTACHMENT_LOAD_OP_LOAD,
.storeOp = VK_ATTACHMENT_STORE_OP_STORE,
};
VkRenderingInfo render_info = {
.sType = STYPE(RENDERING_INFO),
.layerCount = 1,
.colorAttachmentCount = 1,
.pColorAttachments = &col_attach_info,
.pDepthAttachment = &depth_attach_info,
.renderArea = {
.extent = {
.width = renderer.vk.sc.extent.width,
.height = renderer.vk.sc.extent.height,
},
},
};
vkCmdBeginRendering(cmd, &render_info);
vkCmdBindPipeline(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, renderer.vk.pipe.pipelines[PIPELINE_CUBE]);
vkCmdBindDescriptorSets(cmd, VK_PIPELINE_BIND_POINT_GRAPHICS, renderer.vk.pipe.pipeline_layout, 0, DESC_TYPE_MAX, renderer.vk.pipe.sets, 0, NULL);
VkViewport viewport = {
.width = (f32)renderer.vk.sc.extent.width,
.height = (f32)renderer.vk.sc.extent.height,
.maxDepth = 1.0,
};
vkCmdSetViewport(cmd, 0, 1, &viewport);
VkRect2D scissor = {
.extent = {
.width = renderer.vk.sc.extent.width,
.height = renderer.vk.sc.extent.height,
},
};
vkCmdSetScissor(cmd, 0, 1, &scissor);
vkCmdDrawIndexed(cmd, 3, 1, 0, 0, 0);
// TODO(MA): maybe store current image layout between functions
}
b32 _FinishFrame()
{
b32 success = true;
VkResult result;
u32 f_ix = renderer.frame_state.frame_cnt % FRAME_OVERLAP;
VkCommandBuffer cmd = renderer.vk.frame.buffers[f_ix];
VkSemaphore sc_sem = renderer.vk.frame.swapchain_sems[f_ix];
VkSemaphore rndr_sem = renderer.vk.frame.render_sems[f_ix];
VkFence fence = renderer.vk.frame.render_fences[f_ix];
vkCmdEndRendering(cmd);
TransitionImage(cmd, renderer.vk.sc.draw_img.img, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
TransitionImage(cmd, renderer.vk.sc.imgs[f_ix], VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
VkExtent2D extent = {
.width = renderer.vk.sc.extent.width,
.height = renderer.vk.sc.extent.height,
};
CopyImageToImage(cmd, renderer.vk.sc.draw_img.img, renderer.vk.sc.imgs[f_ix], extent, extent);
TransitionImage(cmd, renderer.vk.sc.imgs[f_ix], VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_PRESENT_SRC_KHR);
result = vkEndCommandBuffer(cmd);
if (result != VK_SUCCESS)
{
Printf("vkEndCommandBuffer failure: %s", VkResultStr(result));
success = false;
}
if (success)
{
VkCommandBufferSubmitInfo cmd_info = {
.sType = STYPE(COMMAND_BUFFER_SUBMIT_INFO),
.commandBuffer = cmd,
};
VkSemaphoreSubmitInfo wait_info = {
.sType = STYPE(SEMAPHORE_SUBMIT_INFO),
.semaphore = sc_sem,
.stageMask = VK_PIPELINE_STAGE_2_COLOR_ATTACHMENT_OUTPUT_BIT,
.value = 1,
};
VkSemaphoreSubmitInfo signal_info = {
.sType = STYPE(SEMAPHORE_SUBMIT_INFO),
.semaphore = rndr_sem,
.stageMask = VK_PIPELINE_STAGE_2_ALL_GRAPHICS_BIT,
.value = 1,
};
VkSubmitInfo2 submit_info = {
.sType = STYPE(SUBMIT_INFO_2),
.waitSemaphoreInfoCount = 1,
.pWaitSemaphoreInfos = &wait_info,
.signalSemaphoreInfoCount = 1,
.pSignalSemaphoreInfos = &signal_info,
.commandBufferInfoCount = 1,
.pCommandBufferInfos = &cmd_info,
};
result = vkQueueSubmit2(renderer.vk.queues.graphics_queue, 1, &submit_info, fence);
if (result != VK_SUCCESS)
{
Printf("vkQueueSubmit2 failure: %s", VkResultStr(result));
success = false;
}
}
if (success)
{
VkPresentInfoKHR present_info = {
.sType = STYPE(PRESENT_INFO_KHR),
.pSwapchains = &renderer.vk.swapchain,
.swapchainCount = 1,
.pWaitSemaphores = &rndr_sem,
.waitSemaphoreCount = 1,
.pImageIndices = &f_ix,
};
result = vkQueuePresentKHR(renderer.vk.queues.graphics_queue, &present_info);
if (result != VK_SUCCESS)
{
Printf("vkQueuePresentKHR failure: %s", VkResultStr(result));
success = false;
}
}
return success;
}
/** /**
* BACK END API END * BACK END API END
*/ */
@ -23,6 +254,79 @@ void _DestroyRenderer()
* INTERNAL API * INTERNAL API
*/ */
// UTIL
static void CopyImageToImage(VkCommandBuffer cmd, VkImage src, VkImage dst, VkExtent2D src_ext, VkExtent2D dst_ext)
{
VkImageBlit2 blit = {
.sType = STYPE(IMAGE_BLIT_2),
.srcOffsets = {
{},
{ .x = (i32)src_ext.width, .y = (i32)src_ext.height, .z = 1 },
},
.dstOffsets = {
{},
{ .x = (i32)dst_ext.width, .y = (i32)dst_ext.height, .z = 1 },
},
.srcSubresource = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseArrayLayer = 0,
.layerCount = 1,
.mipLevel = 0,
},
.dstSubresource = {
.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT,
.baseArrayLayer = 0,
.layerCount = 1,
.mipLevel = 0,
},
};
VkBlitImageInfo2 blit_info = {
.sType = STYPE(BLIT_IMAGE_INFO_2),
.srcImage = src,
.srcImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
.dstImage = dst,
.dstImageLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
.filter = VK_FILTER_LINEAR,
.regionCount = 1,
.pRegions = &blit,
};
vkCmdBlitImage2(cmd, &blit_info);
}
static void TransitionImage(VkCommandBuffer cmd, VkImage img, VkImageLayout curr, VkImageLayout new)
{
VkImageMemoryBarrier2 barrier = {
.sType = STYPE(IMAGE_MEMORY_BARRIER_2),
.srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
.srcAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT,
.dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT,
.dstAccessMask = VK_ACCESS_2_MEMORY_WRITE_BIT | VK_ACCESS_2_MEMORY_READ_BIT,
.oldLayout = curr,
.newLayout = new,
.image = img,
.subresourceRange = {
.aspectMask = new == VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL ? VK_IMAGE_ASPECT_DEPTH_BIT : VK_IMAGE_ASPECT_COLOR_BIT,
.baseMipLevel = 0,
.levelCount = VK_REMAINING_MIP_LEVELS,
.baseArrayLayer = 0,
.layerCount = VK_REMAINING_ARRAY_LAYERS,
},
};
VkDependencyInfo dep_info = {
.sType = STYPE(DEPENDENCY_INFO),
.imageMemoryBarrierCount = 1,
.pImageMemoryBarriers = &barrier,
};
vkCmdPipelineBarrier2(cmd, &dep_info);
}
// INIT
static b32 InitVulkan(Arena *arena) static b32 InitVulkan(Arena *arena)
{ {
Assert(arena != NULL, "Vulkan memory is null"); Assert(arena != NULL, "Vulkan memory is null");
@ -50,6 +354,7 @@ static b32 InitVulkan(Arena *arena)
Assert(CreateImmediateStructures(), "Unable to create immediate structures"); Assert(CreateImmediateStructures(), "Unable to create immediate structures");
Assert(CreateSwapchain(), "Unable to initialize swapchain and draw images"); Assert(CreateSwapchain(), "Unable to initialize swapchain and draw images");
Assert(CreateDescriptors(), "Unable to initialize descriptors."); Assert(CreateDescriptors(), "Unable to initialize descriptors.");
Assert(CreatePipelines(), "Unable to initialize pipelines.");
ArenaFree(renderer.arena); ArenaFree(renderer.arena);
@ -354,6 +659,8 @@ static b32 InitVkDeviceFunctions() {
INIT_DEV_FN(vkResetCommandBuffer); INIT_DEV_FN(vkResetCommandBuffer);
INIT_DEV_FN(vkFreeCommandBuffers); INIT_DEV_FN(vkFreeCommandBuffers);
INIT_DEV_FN(vkDestroyDescriptorSetLayout); INIT_DEV_FN(vkDestroyDescriptorSetLayout);
INIT_DEV_FN(vkDestroyShaderModule);
INIT_DEV_FN(vkQueuePresentKHR);
return true; return true;
} }
@ -520,6 +827,11 @@ static b32 CreateSwapchain()
if (present_mode != VK_PRESENT_MODE_MAILBOX_KHR) if (present_mode != VK_PRESENT_MODE_MAILBOX_KHR)
present_mode = VK_PRESENT_MODE_FIFO_KHR; present_mode = VK_PRESENT_MODE_FIFO_KHR;
//
// TODO(MA): REMOVE THIS LATER
present_mode = VK_PRESENT_MODE_FIFO_KHR;
swapchain_create_info.minImageCount = capabilities.minImageCount + 1; swapchain_create_info.minImageCount = capabilities.minImageCount + 1;
swapchain_create_info.surface = surface; swapchain_create_info.surface = surface;
swapchain_create_info.imageFormat = renderer.vk.sc.format; swapchain_create_info.imageFormat = renderer.vk.sc.format;
@ -560,8 +872,6 @@ static b32 CreateSwapchain()
.depth = 1, .depth = 1,
}; };
renderer.vk.sc.extent = extent_3d;
VmaAllocationCreateInfo alloc_create_info = { VmaAllocationCreateInfo alloc_create_info = {
.usage = VMA_MEMORY_USAGE_GPU_ONLY, .usage = VMA_MEMORY_USAGE_GPU_ONLY,
.requiredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, .requiredFlags = VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
@ -598,6 +908,11 @@ static b32 CreateSwapchain()
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
success = false; success = false;
// Setting values
renderer.vk.sc.extent = extent_3d;
renderer.vk.sc.depth_img.fmt = depth_image_create_info.format;
renderer.vk.sc.draw_img.fmt = draw_image_create_info.format;
return success; return success;
} }
@ -639,33 +954,33 @@ static b32 CreateDescriptors()
VkDevice device = renderer.vk.device; VkDevice device = renderer.vk.device;
VkResult result; VkResult result;
result = vkCreateDescriptorPool(device, &desc_pool_info, NULL, &renderer.vk.desc.pool); result = vkCreateDescriptorPool(device, &desc_pool_info, NULL, &renderer.vk.pipe.pool);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
success = false; success = false;
result = vkCreateDescriptorSetLayout(device, &shared_layout_create_info, NULL, &renderer.vk.desc.layouts[DESC_TYPE_SHARED]); result = vkCreateDescriptorSetLayout(device, &shared_layout_create_info, NULL, &renderer.vk.pipe.layouts[DESC_TYPE_SHARED]);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
success = false; success = false;
for (u32 i = DESC_TYPE_COMBINED_SAMPLER; i < DESC_TYPE_MAX; i++) for (u32 i = DESC_TYPE_COMBINED_SAMPLER; i < DESC_TYPE_MAX; i++)
{ {
bindless_layout_binding.descriptorType = desc_type_map[i]; bindless_layout_binding.descriptorType = desc_type_map[i];
result = vkCreateDescriptorSetLayout(device, &bindless_layout_create_info, NULL, &renderer.vk.desc.layouts[i]); result = vkCreateDescriptorSetLayout(device, &bindless_layout_create_info, NULL, &renderer.vk.pipe.layouts[i]);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
success = false; success = false;
} }
set_allocate_info.descriptorPool = renderer.vk.desc.pool; set_allocate_info.descriptorPool = renderer.vk.pipe.pool;
set_allocate_info.pSetLayouts = renderer.vk.desc.layouts; set_allocate_info.pSetLayouts = renderer.vk.pipe.layouts;
result = vkAllocateDescriptorSets(device, &set_allocate_info, renderer.vk.desc.sets); result = vkAllocateDescriptorSets(device, &set_allocate_info, renderer.vk.pipe.sets);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
success = false; success = false;
pipeline_layout_create_info.setLayoutCount = DESC_TYPE_MAX; pipeline_layout_create_info.setLayoutCount = DESC_TYPE_MAX;
pipeline_layout_create_info.pSetLayouts = renderer.vk.desc.layouts; pipeline_layout_create_info.pSetLayouts = renderer.vk.pipe.layouts;
result = vkCreatePipelineLayout(device, &pipeline_layout_create_info, NULL, &renderer.vk.desc.pipeline_layout); result = vkCreatePipelineLayout(device, &pipeline_layout_create_info, NULL, &renderer.vk.pipe.pipeline_layout);
if (result != VK_SUCCESS) if (result != VK_SUCCESS)
success = false; success = false;
@ -675,13 +990,72 @@ static b32 CreateDescriptors()
static b32 CreatePipelines() static b32 CreatePipelines()
{ {
b32 success = true; b32 success = true;
VkResult result;
VkDevice device = renderer.vk.device;
VkShaderModule cube_vert, cube_frag;
success &= CreateShaderModule(shader_quad_vert, shader_quad_vert_len, &cube_vert);
success &= CreateShaderModule(shader_quad_frag, shader_quad_frag_len, &cube_frag);
VkPipelineShaderStageCreateInfo cube_shader_stages[] = {
{
.sType = STYPE(PIPELINE_SHADER_STAGE_CREATE_INFO),
.stage = VK_SHADER_STAGE_VERTEX_BIT,
.module = cube_vert,
.pName = "main",
},
{
.sType = STYPE(PIPELINE_SHADER_STAGE_CREATE_INFO),
.stage = VK_SHADER_STAGE_FRAGMENT_BIT,
.module = cube_frag,
.pName = "main",
},
};
VkPipelineRenderingCreateInfo pipeline_render_info = {
.sType = STYPE(PIPELINE_RENDERING_CREATE_INFO),
.colorAttachmentCount = 1,
.pColorAttachmentFormats = &renderer.vk.sc.draw_img.fmt,
.depthAttachmentFormat = renderer.vk.sc.depth_img.fmt,
};
cube_create_info.pStages = cube_shader_stages;
cube_create_info.stageCount = Len(cube_shader_stages);
cube_create_info.layout = renderer.vk.pipe.pipeline_layout;
cube_create_info.pNext = &pipeline_render_info;
result = vkCreateGraphicsPipelines(device, 0, 1, &cube_create_info, NULL, &renderer.vk.pipe.pipelines[PIPELINE_CUBE]);
if (result != VK_SUCCESS)
{
Printf("vkCreateGraphicsPipelines failure: %s", VkResultStr(result));
success = false;
}
vkDestroyShaderModule(device, cube_vert, NULL);
vkDestroyShaderModule(device, cube_frag, NULL);
return success; return success;
} }
static VkShaderModule CreateShaderModule(const char *file_name) static b32 CreateShaderModule(u8 *bytes, u32 len, VkShaderModule *module)
{ {
return NULL; VkResult result;
b32 success = true;
VkShaderModuleCreateInfo module_info = {
.sType = STYPE(SHADER_MODULE_CREATE_INFO),
.codeSize = len,
.pCode = (u32 *)bytes,
};
result = vkCreateShaderModule(renderer.vk.device, &module_info, NULL, module);
if (result != VK_SUCCESS)
{
Printf("vkCreateShaderModule failure: %s", VkResultStr(result));
success = false;
}
return success;
} }
static void DestroyVulkan() static void DestroyVulkan()
@ -693,14 +1067,17 @@ static void DestroyVulkan()
SwapchainStructures sc = renderer.vk.sc; SwapchainStructures sc = renderer.vk.sc;
VmaAllocator vma_alloc = renderer.vk.alloc; VmaAllocator vma_alloc = renderer.vk.alloc;
VkSwapchainKHR swapchain = renderer.vk.swapchain; VkSwapchainKHR swapchain = renderer.vk.swapchain;
DescriptorStructures desc = renderer.vk.desc; PipelineStructures pipe = renderer.vk.pipe;
vkDestroyPipelineLayout(device, desc.pipeline_layout, NULL); for (u32 i = PIPELINE_CUBE; i < PIPELINE_MAX; i++)
vkDestroyPipeline(device, pipe.pipelines[i], NULL);
vkDestroyPipelineLayout(device, pipe.pipeline_layout, NULL);
for (u32 i = DESC_TYPE_SHARED; i < DESC_TYPE_MAX; i++) for (u32 i = DESC_TYPE_SHARED; i < DESC_TYPE_MAX; i++)
vkDestroyDescriptorSetLayout(device, desc.layouts[i], NULL); vkDestroyDescriptorSetLayout(device, pipe.layouts[i], NULL);
vkDestroyDescriptorPool(device, desc.pool, NULL); vkDestroyDescriptorPool(device, pipe.pool, NULL);
vkDestroyImageView(device, sc.draw_img.view, NULL); vkDestroyImageView(device, sc.draw_img.view, NULL);
vmaDestroyImage(vma_alloc, sc.draw_img.img, sc.draw_img.alloc); vmaDestroyImage(vma_alloc, sc.draw_img.img, sc.draw_img.alloc);

View File

@ -5,6 +5,8 @@
#include <vulkan/vulkan.h> #include <vulkan/vulkan.h>
#include "file_data/spv.c"
// Macros // Macros
#define VK_DECLARE(fn) static PFN_##fn fn = NULL #define VK_DECLARE(fn) static PFN_##fn fn = NULL
@ -114,6 +116,8 @@ VK_DECLARE(vkResetFences);
VK_DECLARE(vkResetCommandBuffer); VK_DECLARE(vkResetCommandBuffer);
VK_DECLARE(vkFreeCommandBuffers); VK_DECLARE(vkFreeCommandBuffers);
VK_DECLARE(vkDestroyDescriptorSetLayout); VK_DECLARE(vkDestroyDescriptorSetLayout);
VK_DECLARE(vkDestroyShaderModule);
VK_DECLARE(vkQueuePresentKHR);
// Vulkan Functions END // Vulkan Functions END
@ -152,7 +156,8 @@ typedef struct
VkDescriptorSet sets[DESC_TYPE_MAX]; VkDescriptorSet sets[DESC_TYPE_MAX];
DescBindings *bindings; DescBindings *bindings;
u16 bindings_count; u16 bindings_count;
} DescriptorStructures; VkPipeline pipelines[PIPELINE_MAX];
} PipelineStructures;
typedef struct typedef struct
{ {
@ -202,6 +207,11 @@ typedef struct {
Image depth_img; Image depth_img;
} SwapchainStructures; } SwapchainStructures;
typedef struct {
u32 img_ix;
u64 frame_cnt;
} FrameState;
typedef struct { typedef struct {
Library lib; Library lib;
VkInstance inst; VkInstance inst;
@ -214,7 +224,7 @@ typedef struct {
FrameStructures frame; FrameStructures frame;
ImmediateStructures imm; ImmediateStructures imm;
SwapchainStructures sc; SwapchainStructures sc;
DescriptorStructures desc; PipelineStructures pipe;
#ifdef BUILD_DEBUG #ifdef BUILD_DEBUG
VkDebugUtilsMessengerEXT debug; VkDebugUtilsMessengerEXT debug;
#endif #endif
@ -222,6 +232,7 @@ typedef struct {
typedef struct { typedef struct {
Vulkan_t vk; Vulkan_t vk;
FrameState frame_state;
Arena *arena; Arena *arena;
Arena *perm_arena; Arena *perm_arena;
} Renderer_t; } Renderer_t;
@ -257,10 +268,15 @@ static b32 CreateSwapchain();
static VkFormat GetImageFormat(); static VkFormat GetImageFormat();
static b32 CreateDescriptors(); static b32 CreateDescriptors();
static b32 CreatePipelines(); static b32 CreatePipelines();
static b32 CreateShaderModule(u8 *bytes, u32 len, VkShaderModule *module);
// Destroy // Destroy
static void DestroyVulkan(); static void DestroyVulkan();
// Util
static void TransitionImage(VkCommandBuffer cmd, VkImage img, VkImageLayout curr, VkImageLayout new);
static void CopyImageToImage(VkCommandBuffer cmd, VkImage src, VkImage dst, VkExtent2D src_ext, VkExtent2D dst_ext);
// Renderer Functions Declarations END // Renderer Functions Declarations END
#include "vulkan_config.c" #include "vulkan_config.c"
@ -296,5 +312,13 @@ static char *vulkan_libs[] = {
#endif #endif
// BACKEND API
// Init
b32 _InitRenderer(Arena *arena); b32 _InitRenderer(Arena *arena);
void _DestroyRenderer(); void _DestroyRenderer();
// Rendering
static b32 _BeginFrame();
static void _DrawTriangle();
static b32 _FinishFrame();

View File

@ -2,7 +2,7 @@
layout (location = 0) out vec3 fragColor; layout (location = 0) out vec3 fragColor;
vec2 triangle[3] = vec2[]( vec2 positions[3] = vec2[](
vec2(0.0, -0.5), vec2(0.0, -0.5),
vec2(0.5, 0.5), vec2(0.5, 0.5),
vec2(-0.5, 0.5) vec2(-0.5, 0.5)

View File

@ -0,0 +1,57 @@
// ==========================================
// ====== TODO: Research values here ========
// ==========================================
struct Vertex {
float uv_x;
float uv_y;
float x, y, z;
};
layout (set = 0, binding = 0) uniform GlobalUniform {
mat4 camera_view;
mat4 camera_projection;
mat4 camera_view_projection;
mat4 camera_view_inverse;
mat4 camera_projection_inverse;
mat4 camera_previous_view;
mat4 camera_previous_projection;
vec2 render_resolution;
vec2 jitter_offset;
float delta;
uint frame_count;
} Globals;
layout (set = 0, binding = 1) uniform ShaderOptions {
float exposure;
float alpha;
int debug_display;
uint albedo_texture_indices[];
} Options;
layout (rgba16f, set = 0, binding = 2) uniform image2D image;
layout (set = 1, binding = 0) uniform sampler2D Textures[];
layout (rgba8_snorm, set = 2, binding = 0) uniform image2D Images[];
layout (set = 3, binding = 0) uniform PBRMaterials {
vec3 albedo;
vec3 normal;
float metallic;
float roughness;
float ao;
} Materials[];
layout (std430, buffer_reference) readonly buffer VertexBuffer {
Vertex vertices[];
};
layout (push_constant) uniform constants {
mat4 render_matrix;
VertexBuffer vertex_buffer;
uint sampler_index;
uint image_index;
uint material_index;
} PC;