Files
mirage/tests/utils/test_helpers.cpp
daiqingshuang 2f7d23bf26 Add Vulkan compute scheduler tests and supporting utilities
- Implemented ComputeSchedulerTest to validate device management, task scheduling, and resource cleanup for the compute scheduler.
- Created mock_window class for testing Vulkan surface creation, supporting both headless and windowed modes.
- Added shader_loader utility for loading SPIR-V shaders from files and providing minimal embedded shaders for testing.
- Introduced test_helpers for creating and destroying shader modules, validating device features, and finding memory types.
- Established VulkanTestBase and VulkanGPUTest classes to streamline Vulkan test setup and teardown processes.
2025-11-23 11:32:01 +08:00

61 lines
2.1 KiB
C++

#include "test_helpers.h"
namespace mirage::render::vulkan::test {
namespace helpers {
auto create_test_vertex_shader(vk::Device device, const std::vector<uint32_t>& spirv_code)
-> expected<vk::ShaderModule> {
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<uint32_t>& spirv_code)
-> expected<vk::ShaderModule> {
return create_test_vertex_shader(device, spirv_code);
}
auto create_test_compute_shader(vk::Device device, const std::vector<uint32_t>& spirv_code)
-> expected<vk::ShaderModule> {
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<uint32_t> {
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