- 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.
61 lines
2.1 KiB
C++
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
|