diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..e6dbb42 --- /dev/null +++ b/.editorconfig @@ -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 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 94df93c..54a0b16 100644 --- a/.gitignore +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/evk/evkCommon.h b/evk/evkCommon.h index 45cdb7b..0c4f51c 100644 --- a/evk/evkCommon.h +++ b/evk/evkCommon.h @@ -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) \ No newline at end of file diff --git a/evk/evkDevice.c b/evk/evkDevice.c index d7d2ede..3a07d6e 100644 --- a/evk/evkDevice.c +++ b/evk/evkDevice.c @@ -71,7 +71,7 @@ evkDevice evkCreateDevice(evkDeviceCreateInfo createInfo) device._physicalDevice = evkDetectPhysicalDevice(createInfo.instance, createInfo.physicalDeviceType); device._instance = createInfo.instance; - VkPhysicalDeviceProperties2 physicalDeviceProperties = { + VkPhysicalDeviceProperties2 physicalDeviceProperties = { VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_PROPERTIES_2, }; @@ -200,7 +200,7 @@ evkDevice evkCreateDevice(evkDeviceCreateInfo createInfo) } // Allowing the retrieval of non-requested, but allocated, queues is possible. - // Example: Allocating COMPUTE | GRAPHICS then requesting GRAPHICS should + // Example: Allocating COMPUTE | GRAPHICS then requesting GRAPHICS should // return the already allocated queue for (i32 i = MAX_QUEUE_FAMILIES - 1; i >= 0; i--) { for (i32 j = i - 1; j >= 0; j--) { @@ -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); @@ -221,4 +221,4 @@ evkDevice evkCreateDevice(evkDeviceCreateInfo createInfo) void evkDestroyDevice(evkDevice device) { vkDestroyDevice(device.vk, evkGetAllocationCallbacks()); -} +} \ No newline at end of file diff --git a/evk/evkMemory.c b/evk/evkMemory.c index fa01a21..b0daebd 100644 --- a/evk/evkMemory.c +++ b/evk/evkMemory.c @@ -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; } @@ -86,4 +88,4 @@ evkBuffer evkGPUCreateBuffer(evkGPUAllocationCreateInfo allocationCreateInfo, Vk void evkGPUDestroyBuffer(evkBuffer buf) { vmaDestroyBuffer(buf.allocData.allocator.vma, buf.vk, buf.allocData.allocation.vma); -} +} \ No newline at end of file diff --git a/evk/evkPipeline.c b/evk/evkPipeline.c index f1fa742..9764c49 100644 --- a/evk/evkPipeline.c +++ b/evk/evkPipeline.c @@ -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) @@ -183,7 +183,7 @@ evkPipeline evkCreateGraphicsPipeline(evkDevice device, evkPipelineCreateInfo cr if(createInfo.setLayouts != NULL) { - res.layout = evkCreatePipelineLayout(device, + res.layout = evkCreatePipelineLayout(device, EV_DEFAULT(evkPipelineLayoutCreateInfo, setLayouts = createInfo.setLayouts, ) @@ -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); +} \ No newline at end of file diff --git a/evk/evkPipeline.h b/evk/evkPipeline.h index e3d1d61..0293d21 100644 --- a/evk/evkPipeline.h +++ b/evk/evkPipeline.h @@ -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); diff --git a/evk/evkShader.c b/evk/evkShader.c index 597a4f9..f5f7a42 100644 --- a/evk/evkShader.c +++ b/evk/evkShader.c @@ -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) @@ -138,4 +137,4 @@ VkPipelineShaderStageCreateInfo evkGetShaderStageCreateInfo(evkShader shader) .module = shader.vk, .pName = "main", }; -} +} \ No newline at end of file diff --git a/evk/evkShader.h b/evk/evkShader.h index 0ae0982..26141e4 100644 --- a/evk/evkShader.h +++ b/evk/evkShader.h @@ -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); @@ -15,4 +18,4 @@ VkPipelineShaderStageCreateInfo evkGetShaderStageCreateInfo(evkShader shader); [[nodiscard("Leaking Shader Reflection Data")]] evkShaderReflectionData evkGenerateShaderReflectionData(const u8* shaderBytes, u32 shaderLen); -void evkDestroyShaderReflectionData(evkShaderReflectionData data); +void evkDestroyShaderReflectionData(evkShaderReflectionData data); \ No newline at end of file diff --git a/evk/evkSwapChain.c b/evk/evkSwapChain.c index d6434fc..cb86c15 100644 --- a/evk/evkSwapChain.c +++ b/evk/evkSwapChain.c @@ -9,7 +9,7 @@ evkSwapChain evkCreateSwapChain(evkSwapChainCreateInfo createInfo) VkSurfaceCapabilitiesKHR surfaceCaps; vkGetPhysicalDeviceSurfaceCapabilitiesKHR(createInfo.device._physicalDevice, createInfo.surface, &surfaceCaps); - if(surfaceCaps.maxImageCount == 0) + if(surfaceCaps.maxImageCount == 0) surfaceCaps.maxImageCount = UInt32.MAX; VkCompositeAlphaFlagBitsKHR compositeAlpha = @@ -27,7 +27,7 @@ evkSwapChain evkCreateSwapChain(evkSwapChainCreateInfo createInfo) VkSurfaceFormatKHR surfaceFormats[surfaceFormatCount]; vkGetPhysicalDeviceSurfaceFormatsKHR(createInfo.device._physicalDevice, createInfo.surface, &surfaceFormatCount, surfaceFormats); - // TODO Add format picking logic + // TODO Add format picking logic swapChain.surfaceFormat = surfaceFormats[0]; u32 buffering = min(max(createInfo.imageCount, surfaceCaps.minImageCount), surfaceCaps.maxImageCount); @@ -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]; @@ -69,9 +69,9 @@ evkSwapChain evkCreateSwapChain(evkSwapChainCreateInfo createInfo) for(u32 i = 0; i < buffering; i++) { swapChain.images[i] = (evkImage) { - .vk = swapChainVkImages[i], - .width = imageExtent.width, - .height = imageExtent.height, + .vk = swapChainVkImages[i], + .width = imageExtent.width, + .height = imageExtent.height, .format = swapChain.surfaceFormat.format }; swapChain.imageViews[i] = evkCreateImageView(createInfo.device, swapChain.images[i], @@ -94,4 +94,4 @@ void evkDestroySwapChain(evkDevice device, evkSwapChain swapChain) vec_fini(&swapChain.imageViews); vec_fini(&swapChain.images); vkDestroySwapchainKHR(device.vk, swapChain.vk, NULL); -} +} \ No newline at end of file diff --git a/meson.build b/meson.build index 9a10196..c79e537 100644 --- a/meson.build +++ b/meson.build @@ -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), - dependencies: [ + 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 \ No newline at end of file diff --git a/meson.options b/meson.options index 565599c..57af4e0 100644 --- a/meson.options +++ b/meson.options @@ -1 +1 @@ -option('build_evh_tests', type: 'boolean', value: false, description: 'Build the evol-headers tests') +option('build_samples', type: 'boolean', value: true, description: 'Build the evk samples') diff --git a/main.c b/samples/basic_triangle/basic_triangle.c similarity index 84% rename from main.c rename to samples/basic_triangle/basic_triangle.c index 3c7d330..31f582e 100644 --- a/main.c +++ b/samples/basic_triangle/basic_triangle.c @@ -6,12 +6,21 @@ #define GLFW_INCLUDE_NONE #include -evstring PROJECT_NAME = evstr("evk"); +evstring PROJECT_NAME = evstr("basic_triangle"); -int main(void) +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."); @@ -99,8 +108,8 @@ int main(void) .imageCount = 3, }); - evkCommandPool commandPool = evkCreateCommandPool((evkCommandPoolCreateInfo) { - .device = device, + evkCommandPool commandPool = evkCreateCommandPool((evkCommandPoolCreateInfo) { + .device = device, .queueFlags = VK_QUEUE_GRAPHICS_BIT, .poolFlags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT }); @@ -109,9 +118,15 @@ 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); evkColorAttachment colorAttachment0 = { @@ -122,25 +137,26 @@ int main(void) // TODO Get this from shader reflection data // evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayout( // &device, svec_init(evkDescriptorBinding, { - // { - // .name = evstr("positions"), - // .binding = 0, - // .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, - // .descriptorCount = 1, - // .stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS, + // { + // .name = evstr("positions"), + // .binding = 0, + // .descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, + // .descriptorCount = 1, + // .stageFlags = VK_SHADER_STAGE_ALL_GRAPHICS, // }, // }) // ); // evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromBindings(&device, vertShader.reflect.bindings); + evkDescriptorSetLayout setLayout_0 = evkCreateDescriptorSetLayoutFromShaders(&device, svec_init(evkShader, {vertShader, fragShader})); evkPipelineCreateInfo pipelineCreateInfo = EV_DEFAULT(evkPipelineCreateInfo, - dynamicStates = svec_init(VkDynamicState, { - VK_DYNAMIC_STATE_VIEWPORT, + dynamicStates = svec_init(VkDynamicState, { + VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, }), shaderStages = svec_init(evkShader, { - vertShader, + vertShader, fragShader, }), colorAttachments = svec_init(evkColorAttachment, { @@ -158,8 +174,8 @@ int main(void) ); evkDescriptorSet set_0 = evkCreateDescriptorSet(&(evkDescriptorSetCreateInfo){ - .device = &device, - .allocator = &allocator, + .device = &device, + .allocator = &allocator, .layout = &setLayout_0 }); @@ -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: @@ -342,4 +368,4 @@ DeviceCreationFailed: evkDestroyInstance(instance); InstanceCreationFailed: return 0; -} +} \ No newline at end of file diff --git a/samples/basic_triangle/meson.build b/samples/basic_triangle/meson.build new file mode 100644 index 0000000..b47e1de --- /dev/null +++ b/samples/basic_triangle/meson.build @@ -0,0 +1,10 @@ + +executable( + 'basic_triangle', + 'basic_triangle.c', + dependencies: [ + dependency('evk'), + dependency('glfw3'), + ], + c_args: evk_c_args, +) diff --git a/shaders/tri.frag b/samples/basic_triangle/shaders/basic_triangle.frag similarity index 100% rename from shaders/tri.frag rename to samples/basic_triangle/shaders/basic_triangle.frag diff --git a/shaders/tri.vert b/samples/basic_triangle/shaders/basic_triangle.vert similarity index 81% rename from shaders/tri.vert rename to samples/basic_triangle/shaders/basic_triangle.vert index 269a19a..725a2c1 100644 --- a/shaders/tri.vert +++ b/samples/basic_triangle/shaders/basic_triangle.vert @@ -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); +} \ No newline at end of file diff --git a/samples/meson.build b/samples/meson.build new file mode 100644 index 0000000..99fd94e --- /dev/null +++ b/samples/meson.build @@ -0,0 +1 @@ +subdir('basic_triangle') diff --git a/subprojects/vma.wrap b/subprojects/vma.wrap index 30724f2..3ff196e 100644 --- a/subprojects/vma.wrap +++ b/subprojects/vma.wrap @@ -5,3 +5,6 @@ revision = v3.3.0 depth = 1 patch_directory = vma + +[provide] +dependency_names = vma