Load shaders and create shader module

This commit is contained in:
2026-06-21 00:53:03 +01:00
parent 26ab321641
commit e8a40e04a9
4 changed files with 100 additions and 39 deletions
+1 -1
View File
@@ -18,7 +18,7 @@ build_ktx () {
build_app () {
bear -- clang++ -g -c -Wno-nullability-completeness -DVK_NO_PROTOTYPES -I$VULKAN_SDK/include -Ivendor/include vulkan_profiles/vulkan_profiles.cpp main.cpp
bear -a -- clang -g -c -DVK_NO_PROTOTYPES -Ivulkan_profiles -I$VULKAN_SDK/include $VULKAN_SDK/include/volk/volk.c wapp/wapp.c
bear -a -- clang++ -g -DVK_NO_PROTOTYPES -Lvendor/lib -lSDL3 -lglm -ltinyobjloader -lktx -o main *.o
bear -a -- clang++ -g -DVK_NO_PROTOTYPES -L$VULKAN_SDK/lib -Lvendor/lib -lSDL3 -lglm -ltinyobjloader -lktx -lslang -o main *.o
}
clean_obj () {
+61
View File
@@ -13,6 +13,8 @@
#include <SDL3/SDL_keycode.h>
#include <SDL3/SDL_video.h>
#include <SDL3/SDL_vulkan.h>
#include <slang/slang.h>
#include <slang/slang-com-ptr.h>
#include <tiny_obj_loader.h>
#define VMA_IMPLEMENTATION
#include <vma/vk_mem_alloc.h>
@@ -87,6 +89,8 @@ typedef VkCommandBuffer *VkCommandBufferArray;
typedef Texture *TextureArray;
typedef VkDescriptorImageInfo *VkDescriptorImageInfoArray;
typedef VkBufferImageCopy *VkBufferImageCopyArray;
typedef slang::TargetDesc *SlangTargetDescArray;
typedef slang::CompilerOptionEntry *SlangCompOptEntryArray;
// }}}
// {{{ Helper Function Declarations
@@ -138,6 +142,8 @@ wapp_intern VkDescriptorImageInfoArray tex_descriptors;
wapp_intern VkDescriptorSetLayout desc_set_layout_tex = VK_NULL_HANDLE;
wapp_intern VkDescriptorPool desc_pool = VK_NULL_HANDLE;
wapp_intern VkDescriptorSet desc_set_tex = VK_NULL_HANDLE;
wapp_intern Slang::ComPtr<slang::IGlobalSession> slang_global_session;
wapp_intern VkShaderModule shader_module = VK_NULL_HANDLE;
// }}}
int main() {
@@ -900,6 +906,60 @@ int main() {
wapp_mem_arena_allocator_temp_end(&arena);
// {{{ Shaders
// {{{ Runtime Compile Shaders
// {{{ Initialise Slang Session
// Global session: the connection between the application and the Slang library
slang::createGlobalSession(slang_global_session.writeRef());
// {{{ Define Compilation Scope
slang::TargetDesc target = {};
target.format = SLANG_SPIRV;
target.profile = {slang_global_session->findProfile("spirv_1_4")};
SlangTargetDescArray slang_targets = wapp_array_with_capacity(slang::TargetDesc, 8, ARRAY_INIT_NONE);
wapp_array_append_capped(slang::TargetDesc, slang_targets, &target);
slang::CompilerOptionEntry entry = {};
entry.name = slang::CompilerOptionName::EmitSpirvDirectly;
entry.value = {slang::CompilerOptionValueKind::Int, 1};
SlangCompOptEntryArray slang_options = wapp_array_with_capacity(slang::CompilerOptionEntry, 8, ARRAY_INIT_NONE);
wapp_array_append_capped(slang::CompilerOptionEntry, slang_options, &entry);
// }}}
// {{{ Create Session
slang::SessionDesc slang_session_desc = {};
slang_session_desc.targets = slang_targets;
slang_session_desc.targetCount = wapp_array_count(slang_targets);
slang_session_desc.defaultMatrixLayoutMode = SLANG_MATRIX_LAYOUT_COLUMN_MAJOR;
slang_session_desc.compilerOptionEntries = slang_options;
slang_session_desc.compilerOptionEntryCount = wapp_array_count(slang_options);
Slang::ComPtr<slang::ISession> slang_session;
slang_global_session->createSession(slang_session_desc, slang_session.writeRef());
// }}}
// }}}
// {{{ Load Shader Code
Slang::ComPtr<slang::IModule> slang_module {
slang_session->loadModuleFromSource("triangle", "assets/shader.slang", nullptr, nullptr),
};
Slang::ComPtr<slang::IBlob> spirv;
slang_module->getTargetCode(0, spirv.writeRef());
// }}}
// }}}
// {{{ Create Shader Module
VkShaderModuleCreateInfo module_create_info = {};
module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
module_create_info.codeSize = spirv->getBufferSize();
module_create_info.pCode = (u32 *)spirv->getBufferPointer();
check(vkCreateShaderModule(device, &module_create_info, NULL, &shader_module));
// }}}
// }}}
// {{{ Render Loop
SDL_Event event = {};
while (running) {
@@ -919,6 +979,7 @@ int main() {
// }}}
// {{{ Cleanup
vkDestroyShaderModule(device, shader_module, NULL);
vkDestroyDescriptorPool(device, desc_pool, NULL);
vkDestroyDescriptorSetLayout(device, desc_set_layout_tex, NULL);
for (u32 i = 0; i < wapp_array_count(textures); ++i) {
+1 -1
View File
@@ -1,3 +1,3 @@
#!/bin/bash
LD_LIBRARY_PATH=vendor/lib/:$LD_LIBRARY_PATH ./main
LD_LIBRARY_PATH=$VULKAN_SDK/lib:vendor/lib/:$LD_LIBRARY_PATH ./main