11 Commits

Author SHA1 Message Date
mo7sen 446ce9ced1 Merge pull request 'Samples' (#1) from samples into master
Test Compilation / Build evk (push) Successful in 1m18s
Reviewed-on: #1
2026-05-08 17:49:56 +00:00
mo7sen bd83ffb8bf Updated .gitignore
Test Compilation / Build evk (push) Successful in 25s
2026-05-08 20:48:09 +03:00
mo7sen 883b719b29 Multiple changes + fixes 2026-05-08 20:48:09 +03:00
mo7sen 2a357c494c Ensured usage of bundled shaderc instead of the VulkanSDK one 2026-05-08 20:48:09 +03:00
mo7sen 223b648cfd Added .editorconfig 2026-05-08 20:48:09 +03:00
mo7sen 355169ca0c Updated + Formatted meson.build 2026-05-08 20:48:09 +03:00
mo7sen 52ca9bef05 Enforced usage of volk subproject 2026-05-08 20:48:09 +03:00
mo7sen 0a7315746e Added missing dependency name in vma.wrap 2026-05-08 20:48:09 +03:00
mo7sen e4f033ea1a Started moving to a samples structure 2026-05-08 20:47:58 +03:00
mo7sen 3d37d30478 Disabled tests building for evol-headers subproject
Test Compilation / Build evk (push) Successful in 24s
2026-05-07 03:14:28 +03:00
mo7sen 26a2d6743a Added subprojects and build artifact caching to actions
Test Compilation / Build evk (push) Successful in 25s
2026-05-07 02:09:00 +03:00
21 changed files with 246 additions and 89 deletions
+17
View File
@@ -0,0 +1,17 @@
root = true
# All (Defaults)
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = false
trim_trailing_whitespace = true
max_line_length = 80
indent_style = space
indent_size = 2
# C
# [*.{c,h}]
# indent_style = space
# indent_size = 2
+66 -1
View File
@@ -3,7 +3,7 @@ run-name: ${{github.event_name}} - Build evk - ${{github.sha}}
on: [push]
jobs:
Run tests:
Build evk:
runs-on: ubuntu-latest
container:
@@ -11,6 +11,71 @@ jobs:
steps:
- uses: actions/checkout@v4
- name: Cache shaderc
id: cache-shaderc
uses: actions/cache@v4
env:
cache-name: cache-shaderc-src
with:
path: |
subprojects/shaderc/
build/subprojects/shaderc/
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('subprojects/shaderc.wrap', 'subprojects/packagefiles/shaderc/**/*') }}
- name: Cache VMA
id: cache-vma
uses: actions/cache@v4
env:
cache-name: cache-vma
with:
path: |
subprojects/vma/
build/subprojects/vma/
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('subprojects/vma.wrap', 'subprojects/packagefiles/vma/**/*') }}
- name: Cache volk
id: cache-volk
uses: actions/cache@v4
env:
cache-name: cache-volk
with:
path: |
subprojects/volk/
build/subprojects/volk/
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('subprojects/volk.wrap', 'subprojects/packagefiles/volk/**/*') }}
- name: Cache SPIRV-Reflect
id: cache-spvref
uses: actions/cache@v4
env:
cache-name: cache-spvref
with:
path: |
subprojects/spvref/
build/subprojects/spvref/
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('subprojects/spvref.wrap', 'subprojects/packagefiles/spvref/**/*') }}
- name: Cache GLFW
id: cache-glfw
uses: actions/cache@v4
env:
cache-name: cache-glfw
with:
path: |
subprojects/glfw/
build/subprojects/glfw/
key: ${{ runner.os }}-${{ env.cache-name }}-${{ hashFiles('subprojects/glfw.wrap', 'subprojects/packagefiles/glfw/**/*') }}
- name: Cache ninja
id: cache-ninja
uses: actions/cache@v4
env:
cache-name: cache-ninja
with:
path: |
build/.ninja_log
build/.ninja_deps
key: ${{ runner.os }}-${{ env.cache-name }}-${{ github.run_id }}
restore-keys: |
${{ runner.os }}-${{ env.cache-name }}-
- name: Configure
run: meson setup build
+3
View File
@@ -59,3 +59,6 @@ compile_commands.json
/subprojects/*
!/subprojects/*.wrap
!/subprojects/packagefiles
# Internal wrap that is moved here during the configure step
/subprojects/shaderc_cmake.wrap
+6 -6
View File
@@ -88,9 +88,9 @@ static inline const char* VkResultStrings(VkResult res) {
}
};
#define EVK_ASSERT(fn) do { \
VkResult __vk_assert_result_internal = fn; \
if(__vk_assert_result_internal != VK_SUCCESS) { \
ev_log_error("[VulkanError] `%s` returned error code %d ('%s')", EV_STRINGIZE(fn), __vk_assert_result_internal, VkResultStrings(__vk_assert_result_internal));\
} \
} while (0)
static VkResult __evk_check_result_internal;
#define EVK_CHECK(fn) ( \
__evk_check_result_internal = fn, \
__evk_check_result_internal != VK_SUCCESS? \
ev_log_error("[VulkanError] `%s` returned error code %d ('%s')", EV_STRINGIZE(fn), __evk_check_result_internal, VkResultStrings(__evk_check_result_internal)):0, \
__evk_check_result_internal)
+1 -1
View File
@@ -210,7 +210,7 @@ evkDevice evkCreateDevice(evkDeviceCreateInfo createInfo)
}
}
EVK_ASSERT(vkCreateDevice(device._physicalDevice, &vkDeviceCreateInfo, evkGetAllocationCallbacks(), &device.vk));
EVK_CHECK(vkCreateDevice(device._physicalDevice, &vkDeviceCreateInfo, evkGetAllocationCallbacks(), &device.vk));
vec_fini(&queueCreateInfoList);
vec_fini(&priorities);
+2
View File
@@ -56,6 +56,7 @@ evkImage evkGPUCreateImage(evkGPUAllocationCreateInfo allocationCreateInfo, VkIm
.flags = allocationCreateInfo.allocationFlags,
.pool = allocationCreateInfo.pool.vma,
};
img.allocData.allocator = allocationCreateInfo.allocator;
vmaCreateImage(allocationCreateInfo.allocator.vma, imageCreateInfo, &vmaAllocCreateInfo, &img.vk, &img.allocData.allocation.vma, &img.allocData.allocationInfo.vma);
@@ -79,6 +80,7 @@ evkBuffer evkGPUCreateBuffer(evkGPUAllocationCreateInfo allocationCreateInfo, Vk
vmaCreateBuffer(allocationCreateInfo.allocator.vma, bufferCreateInfo, &vmaAllocCreateInfo, &buf.vk, &buf.allocData.allocation.vma, &buf.allocData.allocationInfo.vma);
buf.usage = bufferCreateInfo->usage;
buf.allocData.allocator = allocationCreateInfo.allocator;
return buf;
}
+7 -2
View File
@@ -37,7 +37,7 @@ void evkDestroyPipelineLayout(evkDevice device, evkPipelineLayout layout)
evkPipeline evkCreateComputePipeline(evkDevice device, evkPipelineCreateInfo createInfo)
{
// return EV_INVALID(evkPipeline);
}
evkPipeline evkCreateGraphicsPipeline(evkDevice device, evkPipelineCreateInfo createInfo)
@@ -210,7 +210,7 @@ evkPipeline evkCreateGraphicsPipeline(evkDevice device, evkPipelineCreateInfo cr
.layout = res.layout.vk,
};
EVK_ASSERT(vkCreateGraphicsPipelines(device.vk, VK_NULL_HANDLE, 1, &graphicsPipelineCreateInfo, NULL, &res.vk));
EVK_CHECK(vkCreateGraphicsPipelines(device.vk, VK_NULL_HANDLE, 1, &graphicsPipelineCreateInfo, NULL, &res.vk));
res._device = device;
@@ -239,3 +239,8 @@ void evkCmdBindPipeline(evkCommandBuffer* cmdbuf, evkPipeline* pipeline)
cmdbuf->boundPipeline = pipeline;
vkCmdBindPipeline(cmdbuf->vk, (VkPipelineBindPoint)pipeline->type, pipeline->vk);
}
void evkCmdImageBarrier(evkCommandBuffer* cmdbuf, VkImageMemoryBarrier barrier)
{
vkCmdPipelineBarrier(cmdbuf->vk, 0, 0, 0, 0, NULL, 0, NULL, 1, &barrier);
}
+2
View File
@@ -10,3 +10,5 @@ evkPipeline evkCreatePipeline(evkDevice device, evkPipelineCreateInfo createInfo
void evkDestroyPipeline(evkPipeline pipeline);
void evkCmdBindPipeline(evkCommandBuffer* cmdbuf, evkPipeline* pipeline);
void evkCmdImageBarrier(evkCommandBuffer* cmdbuf, VkImageMemoryBarrier barrier);
+9 -10
View File
@@ -107,27 +107,26 @@ void evkDestroyShaderCompiler(evkShaderCompiler compiler)
shaderc_compiler_release(compiler.sc);
}
evkShader evkInitShaderFromFile(evkDevice device, evkShaderCompiler compiler, evstring shaderPath)
evkShader evkInitShaderFromString(evkDevice device, evkShaderCompiler compiler,evstring shaderName, evstring shaderText)
{
evstring shaderText = evstring_readFile(shaderPath);
shaderc_compilation_result_t compilation_result = shaderc_compile_into_spv(compiler.sc, shaderText, evstring_getLength(shaderText), shaderc_glsl_infer_from_source, shaderPath, "main", compiler.scopt);
shaderc_compilation_result_t compilation_result = shaderc_compile_into_spv(compiler.sc, shaderText, evstring_getLength(shaderText), shaderc_glsl_infer_from_source, shaderName, "main", compiler.scopt);
shaderc_compilation_status status = shaderc_result_get_compilation_status(compilation_result);
u32 errorCount = shaderc_result_get_num_errors(compilation_result);
u32 warnCount = shaderc_result_get_num_warnings(compilation_result);
ev_log_info("[[evkShader]] %s Compilation Status: %d ( %d Errors, %d Warnings )", shaderPath, status, errorCount, warnCount);
ev_log_info("[[evkShader]] %s Compilation Status: %d ( %d Errors, %d Warnings )", shaderName, status, errorCount, warnCount);
if(errorCount + warnCount > 0)
{
ev_log_error("Errors:\n%s", shaderc_result_get_error_message(compilation_result));
}
evkShader shader = evkInitShaderFromBytes(device, (u8*)shaderc_result_get_bytes(compilation_result), shaderc_result_get_length(compilation_result));
evstring_free(shaderText);
return shader;
return evkInitShaderFromBytes(device, (u8*)shaderc_result_get_bytes(compilation_result), shaderc_result_get_length(compilation_result));
}
evkShader evkInitShaderFromFile(evkDevice device, evkShaderCompiler compiler, evstring shaderPath)
{
evstring shaderText = evstring_readFile(shaderPath);
return evkInitShaderFromString(device, compiler, shaderPath, shaderText);
}
VkPipelineShaderStageCreateInfo evkGetShaderStageCreateInfo(evkShader shader)
+3
View File
@@ -4,6 +4,9 @@
[[nodiscard("Leaking VkShaderModule")]]
evkShader evkInitShaderFromBytes(evkDevice device, const u8* shaderBytes, u32 shaderLen);
[[nodiscard("Leaking VkShaderModule")]]
evkShader evkInitShaderFromString(evkDevice device, evkShaderCompiler compiler, evstring shaderName, evstring shaderText);
[[nodiscard("Leaking VkShaderModule")]]
evkShader evkInitShaderFromFile(evkDevice device, evkShaderCompiler compiler, evstring shaderPath);
void evkDestroyShader(evkDevice device, evkShader shader);
+1 -1
View File
@@ -56,7 +56,7 @@ evkSwapChain evkCreateSwapChain(evkSwapChainCreateInfo createInfo)
.oldSwapchain = VK_NULL_HANDLE,
};
EVK_ASSERT(vkCreateSwapchainKHR(createInfo.device.vk, &swapChainCreateInfo, NULL, &swapChain.vk));
EVK_CHECK(vkCreateSwapchainKHR(createInfo.device.vk, &swapChainCreateInfo, NULL, &swapChain.vk));
vkGetSwapchainImagesKHR(createInfo.device.vk, swapChain.vk, &buffering, NULL);
VkImage swapChainVkImages[buffering];
+39 -21
View File
@@ -1,11 +1,15 @@
project('evk', ['c','cpp'],
version : '0.1',
default_options : [
'c_std=c23',
'default_library=static',
'c_args=-fcolor-diagnostics -fansi-escape-codes',
'cpp_args=-fcolor-diagnostics -fansi-escape-codes',
])
project(
'evk',
['c', 'cpp'],
version: '0.1',
default_options: {
'c_std': 'c23',
'default_library': 'static',
'c_args': '-fcolor-diagnostics -fansi-escape-codes',
'cpp_args': '-fcolor-diagnostics -fansi-escape-codes',
},
meson_version: '>=1.2',
)
build_config = configuration_data()
@@ -26,7 +30,9 @@ disabled_warnings = {
],
}
subproject('evol-headers')
subproject('evol-headers', default_options: {'build_tests': false})
subproject('volk')
subproject('shaderc')
evk_c_args = []
@@ -39,16 +45,16 @@ elif cc.get_id() == 'clang'
endif
foreach w : disabled_warnings[cc.get_id()]
evk_c_args += '-Wno-'+w
evk_c_args += '-Wno-' + w
endforeach
evk_incdir = [
'.',
]
evk_incdir = include_directories(
[
'.',
],
)
evk_src = [
'main.c',
'evk/evkInstance.c',
'evk/evkDevice.c',
'evk/evkAllocator.c',
@@ -65,20 +71,32 @@ evk_src = [
'evk/evkMemory.c',
]
executable(
evk_lib = library(
'evk',
evk_src,
include_directories: include_directories(evk_incdir),
include_directories: evk_incdir,
dependencies: [
dependency('evol-headers'),
dependency('vma'),
dependency('volk'),
dependency('glfw3'),
dependency('shaderc'),
dependency('spvref'),
],
c_args: evk_c_args,
)
evk_dep = declare_dependency(
link_with: evk_lib,
include_directories: evk_incdir,
dependencies: [
dependency('volk').partial_dependency(includes: true, compile_args: true),
dependency('vma').partial_dependency(includes: true),
dependency('evol-headers').partial_dependency(includes: true),
],
)
meson.override_dependency('evk', evk_dep)
if get_option('build_samples')
subdir('samples')
endif
+1
View File
@@ -0,0 +1 @@
option('build_samples', type: 'boolean', value: true, description: 'Build the evk samples')
@@ -6,12 +6,21 @@
#define GLFW_INCLUDE_NONE
#include <GLFW/glfw3.h>
evstring PROJECT_NAME = evstr("evk");
evstring PROJECT_NAME = evstr("basic_triangle");
char vertexShaderBytes[] = {
#embed "shaders/basic_triangle.vert"
,'\0'
};
char fragmentShaderBytes[] = {
#embed "shaders/basic_triangle.frag"
,'\0'
};
int main(void)
{
u32 width = 1024;
u32 height = 1024;
u32 width = 1280;
u32 height = 800;
evkInstance instance = evkCreateInstance((evkInstanceCreateInfo){
.applicationInfo = EV_DEFAULT(evkApplicationInfo),
@@ -74,7 +83,7 @@ int main(void)
}
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
GLFWwindow* window = glfwCreateWindow(1024,1024, "evk", NULL, NULL);
GLFWwindow* window = glfwCreateWindow(width, height, "evk", NULL, NULL);
if(!window)
{
ev_log_error("Window Creation Failed.");
@@ -82,7 +91,7 @@ int main(void)
}
VkSurfaceKHR surface;
VkResult err = glfwCreateWindowSurface(instance.vk, window, NULL, &surface);
VkResult err = EVK_CHECK(glfwCreateWindowSurface(instance.vk, window, NULL, &surface));
if (err)
{
ev_log_error("Surface creation failed.");
@@ -109,8 +118,14 @@ int main(void)
evkShaderCompiler compiler = evkCreateShaderCompiler();
evkShader vertShader = evkInitShaderFromFile(device, compiler, "shaders/tri.vert");
evkShader fragShader = evkInitShaderFromFile(device, compiler, "shaders/tri.frag");
evstring vertexShaderText = evstring_new(vertexShaderBytes);
evstring fragmentShaderText = evstring_new(fragmentShaderBytes);
evkShader vertShader = evkInitShaderFromString(device, compiler, evstr("basic_triangle.vert"),vertexShaderText);
evkShader fragShader = evkInitShaderFromString(device, compiler, evstr("basic_triangle.frag"), fragmentShaderText);
evstring_free(vertexShaderText);
evstring_free(fragmentShaderText);
evkDestroyShaderCompiler(compiler);
@@ -132,6 +147,7 @@ int main(void)
// })
// );
// evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromBindings(&device, vertShader.reflect.bindings);
evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromShaders(&device, svec_init(evkShader, {vertShader, fragShader}));
evkPipelineCreateInfo pipelineCreateInfo = EV_DEFAULT(evkPipelineCreateInfo,
@@ -228,7 +244,7 @@ int main(void)
{
imageIdx = (imageIdx + 1) % imageCount;
u32 swapChainImageIdx;
EVK_ASSERT(vkAcquireNextImageKHR(device.vk, swapChain.vk, UInt64.MAX, imageAcquiredSemaphores[imageIdx], VK_NULL_HANDLE, &swapChainImageIdx));
EVK_CHECK(vkAcquireNextImageKHR(device.vk, swapChain.vk, UInt64.MAX, imageAcquiredSemaphores[imageIdx], VK_NULL_HANDLE, &swapChainImageIdx));
evkCommandBuffer cmdbuf = commandBuffers[imageIdx];
@@ -246,6 +262,12 @@ int main(void)
evkBeginPrimaryCommandBuffer(&cmdbuf);
{
evkCmdImageBarrier(&cmdbuf, EV_DEFAULT(VkImageMemoryBarrier,
image = swapChain.images[swapChainImageIdx].vk,
newLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT
));
VkDeviceSize offset = 0;
vkCmdBindVertexBuffers(cmdbuf.vk, 0, 1, &vertBuf.vk, &offset);
@@ -261,13 +283,12 @@ int main(void)
vkCmdEndRenderingKHR(cmdbuf.vk);
VkImageMemoryBarrier imageMemoryBarrier = EV_DEFAULT(VkImageMemoryBarrier,
evkCmdImageBarrier(&cmdbuf, EV_DEFAULT(VkImageMemoryBarrier,
image = swapChain.images[swapChainImageIdx].vk,
oldLayout = VK_IMAGE_LAYOUT_ATTACHMENT_OPTIMAL_KHR,
newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT
);
vkCmdPipelineBarrier(cmdbuf.vk, 0, 0, 0, 0, NULL, 0, NULL, 1, &imageMemoryBarrier);
));
}
evkEndCommandBuffer(&cmdbuf);
@@ -317,6 +338,9 @@ int main(void)
evkDestroyPipeline(graphicsPipeline);
evkDestroyBuffer(vertBuf);
evkDestroyBuffer(uniBuf);
evkDestroyDescriptorSet(&device, &set_0);
evkDestroyDescriptorSetLayout(&device, &setLayout_0);
@@ -326,6 +350,8 @@ int main(void)
evkFreeCommandBuffers(device, commandPool, commandBuffers);
evkDestroyCommandPool(device, commandPool);
evkGPUDestroyAllocator(allocator);
evkDestroySwapChain(device, swapChain);
// SwapchainCreationFailed:
+10
View File
@@ -0,0 +1,10 @@
executable(
'basic_triangle',
'basic_triangle.c',
dependencies: [
dependency('evk'),
dependency('glfw3'),
],
c_args: evk_c_args,
)
@@ -1,7 +1,7 @@
#version 450
#pragma shader_stage(vertex)
// in layout(location=0) vec2 position;
in layout(location=0) vec2 position;
layout(set=0, binding=0) uniform data {
vec4 positions[3];
@@ -12,4 +12,5 @@ void main() {
// gl_Position = vec4(position, 0.0, 1.0);
// gl_Position = vec4(inputData.positions[gl_VertexIndex], 0.0, 1.0);
gl_Position = vertexData.positions[gl_VertexIndex];
// gl_Position = vec4(position, 0.0, 1.0);
}
+1
View File
@@ -0,0 +1 @@
subdir('basic_triangle')
+1 -1
View File
@@ -1,7 +1,7 @@
[wrap-git]
directory = spvref
url = https://github.com/KhronosGroup/SPIRV-Reflect
revision = main
revision = vulkan-sdk-1.4.309.0
depth = 1
patch_directory = spvref
+4 -1
View File
@@ -1,7 +1,10 @@
[wrap-git]
directory = vma
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
revision = master
revision = v3.3.0
depth = 1
patch_directory = vma
[provide]
dependency_names = vma
+2 -1
View File
@@ -1,7 +1,8 @@
[wrap-git]
directory = volk
url = https://github.com/zeux/volk
revision = master
revision = vulkan-sdk-1.4.309.0
depth = 1
patch_directory = volk