#include "test_helpers.h" namespace mirage::render::vulkan::test { namespace helpers { auto create_test_vertex_shader(vk::Device device, const std::vector& spirv_code) -> expected { vk::ShaderModuleCreateInfo create_info{}; create_info.codeSize = spirv_code.size() * sizeof(uint32_t); create_info.pCode = spirv_code.data(); auto result = device.createShaderModule(create_info); if (result.result != vk::Result::eSuccess) { return std::unexpected(result.result); } return result.value; } auto create_test_fragment_shader(vk::Device device, const std::vector& spirv_code) -> expected { return create_test_vertex_shader(device, spirv_code); } auto create_test_compute_shader(vk::Device device, const std::vector& spirv_code) -> expected { return create_test_vertex_shader(device, spirv_code); } void destroy_shader_module(vk::Device device, vk::ShaderModule module) { if (module) { device.destroyShaderModule(module); } } bool validate_device_features(vk::PhysicalDevice device, const vk::PhysicalDeviceFeatures& required) { auto available = device.getFeatures(); // Check a few common features as examples if (required.geometryShader && !available.geometryShader) return false; if (required.tessellationShader && !available.tessellationShader) return false; if (required.multiDrawIndirect && !available.multiDrawIndirect) return false; return true; } auto find_memory_type(vk::PhysicalDevice physical_device, uint32_t type_filter, vk::MemoryPropertyFlags properties) -> std::optional { auto mem_properties = physical_device.getMemoryProperties(); for (uint32_t i = 0; i < mem_properties.memoryTypeCount; i++) { if ((type_filter & (1 << i)) && (mem_properties.memoryTypes[i].propertyFlags & properties) == properties) { return i; } } return std::nullopt; } } // namespace helpers } // namespace mirage::render::vulkan::test